
简介这份R语言试题及答案文档面向正在学习或备考R语言的学习者尤其适合需要系统梳理基础语法与统计概念的高校学生和数据分析入门者。内容围绕描述性统计与推断性统计的区分、名义数据与计量数据等数据类型判定以及R语言基本操作展开涵盖getwd()、head()、ls()、rm()等常用命令的用法并延伸到向量运算、因子创建、矩阵构造与索引等数据操作场景。资源包内含1个docx文件约96KB以试题与答案解析的形式呈现便于对照练习与自测。目前已有11252人学习下载说明其在R语言入门练习中具有较高的参考价值。读者可通过逐题作答与核对答案快速定位知识盲区掌握中位数、均值、方差、标准差等统计函数的调用方式理解逻辑变量、类型转换与向量化运算的输出规律从而为后续统计建模与数据分析打下扎实基础。1. 从一份 R 语言试题文档说起它到底能帮你补上哪些基础漏洞很多人学 R 语言有个错觉能跑通read.csv、能画出一张ggplot2的图就觉得自己入门了。结果一到面试或者带新人的时候被问一句「which.min返回的是值还是位置」「factor的levels和labels到底谁管顺序」当场卡壳。这份《R 试题附带答案.docx》就是冲着这类基础漏洞来的——它不是教程而是一份覆盖描述性统计、数据类型、R 基本操作、向量与矩阵、数据框、控制流、概率分布、参数估计与假设检验的题库每道题后面直接附了答案。适合两类人一是正在准备 R 相关课程考试或面试的从业者二是已经会用 R 但想系统回炉基础概念的人。文档本身是 docx 格式题目按章节编号答案紧跟在每节末尾对照起来不费劲。2. 描述性统计与数据类型先搞清楚你手里的数到底是什么2.1 描述性统计和推断性统计的分界线文档第 1 章前几道题反复在问同一件事用图或表描述数据属于什么统计答案是描述性统计。统计学分为描述性统计和推断性统计这条线看着简单但实际工作中很多人会混。描述性统计只关心你手上这批数据本身——均值、中位数、频数、条形图、饼图都是对已有数据的概括。推断性统计则是用样本去猜总体比如用 t 检验判断两组均值差异是否显著背后依赖的是概率分布和抽样理论。为什么这个区分重要因为选错方法会导致结论站不住脚。你拿一批全量数据算了个均值然后说「这个均值可以推广到所有同类场景」这就越界了——全量数据不需要推断样本数据才需要。文档里用选择题的形式把这个边界划得很清楚做完一遍基本不会再犯。2.2 数据类型名义、有序、计数、计量文档第 1 章第 3 到第 6 题集中考数据类型。学历是名义数据还是有序数据答案是名义数据——因为「本科」「硕士」「博士」之间没有天然的数学距离只是分类标签。身高是计量数据因为可以连续测量、可以做加减乘除。定量数据分为计数数据和计量数据定性数据分为名义数据和有序数据。这套分类不是学术摆设。在 R 里名义数据对应factor且不需要设置orderedTRUE有序数据则需要orderedTRUE。如果你把有序因子当名义因子处理做回归时参考水平的选择就会出问题。我一般拿到数据后的第一件事就是确认每一列到底是哪类然后再决定用factor()还是as.numeric()。2.3 用 R 验证数据类型判断光看概念容易忘直接在 R 里跑一遍印象更深# 构造一个包含名义和有序数据的数据框 df - data.frame( education factor(c(本科, 硕士, 博士, 本科), levels c(本科, 硕士, 博士), ordered TRUE), # 有序因子 gender factor(c(男, 女, 男, 女)), # 名义因子 height c(170, 165, 180, 160) # 计量数据 ) # 查看各列类型 str(df) # 判断是否为有序因子 is.ordered(df$education) # TRUE is.ordered(df$gender) # FALSE # 名义数据做频数统计 table(df$gender) # 计量数据做描述性统计 mean(df$height) sd(df$height)factor()里的levels参数决定了类别的排列顺序orderedTRUE则告诉 R 这些类别之间有大小关系。str()会显示每列的底层类型is.ordered()用来验证你的判断对不对。table()是定性数据频数统计的标准函数mean()和sd()则只对定量数据有意义。跑完这段代码数据类型的概念就不再是纸面上的选择题了。3. R 基本操作与向量运算那些你以为会了其实没会的命令3.1 工作目录、对象管理与函数调用文档第 2 章前几道题考的是 R 环境的基本操作。查看当前工作目录用getwd()设置工作目录用setwd()列出当前工作空间所有变量名用ls()删除以字母 n 开头的所有对象用rm(listls(pat^n))。这几条命令看着不起眼但实际项目中用错一次就够你排查半天。head()函数默认显示前 6 个观测值要看前 10 个就写head(rt, n10)。这里有个细节n参数可以省略写成head(rt, 10)效果一样但显式写n10可读性更好。我见过有人在脚本里写head(rt, 10)然后被同事问「这个 10 是行数还是列数」所以后来我都强制自己写参数名。# 查看当前工作目录 getwd() # 列出工作空间中所有对象名 ls() # 创建几个以 n 开头的变量 n1 - 1:10 n2 - letters n3 - matrix(1:9, nrow 3) other_var - keep me # 删除所有以 n 开头的对象 rm(list ls(pat ^n)) # 再次查看n1 n2 n3 已删除other_var 保留 ls()ls(pat^n)里的pat参数接受正则表达式^n表示以 n 开头。rm(list...)是删除对象的固定写法list不能省。这段代码在清理临时变量时特别有用比如你跑了一个循环生成了一堆中间对象用这条命令可以一次性清掉。3.2 向量运算与常用统计函数文档第 2 章中段大量考向量运算。c(1,2,3,4,5) c(20,200)的结果是[1] 21 202 23 204 25因为 R 的向量加法会自动循环补齐短向量。1:n-1的结果是0 1 2因为冒号运算符优先级高于减号先算1:n再整体减 1。这些规则在写脚本时如果记混结果会静默出错——R 不会报错只会给你一个看起来合理但实际错误的数。常用统计函数方面中位数是median()均值是mean()方差是var()标准差是sd()。sum(seq(1,5,by2))的结果是 9因为seq(1,5,by2)生成1 3 5。mean(rep(1:3, length.out5))的结果是 2.6因为rep把1 2 3循环扩展到 5 个元素变成1 2 3 1 2均值是 1.8——等等这里要小心文档里给的答案是 1.8我重新算一下1231299/51.8。对是 1.8不是 2.6。摘要里写的 2.6 可能是笔误以文档答案为准。# 向量循环补齐 c(1, 2, 3, 4, 5) c(20, 200) # 结果: 21 202 23 204 25 # 冒号优先级 1:5 - 1 # 结果: 0 1 2 3 4 # seq 生成等差数列 sum(seq(1, 5, by 2)) # 结果: 9 # rep 的 length.out 参数 mean(rep(1:3, length.out 5)) # 结果: 1.8 # which 返回满足条件的下标 which(2:8 5) # 结果: 6 7 8对应原向量中值大于5的位置 # 向量索引与条件筛选 x - rep(c(1, 4, 7), c(3, 2, 1)) x[x 5] # 结果: 7 v - 10:5 w - v[c(2, 4)] mean(w) # 结果: 8 v[-(1:5)] # 结果: 空集负索引排除前5个元素which()返回的是逻辑条件为TRUE的位置下标不是值本身。x[x5]是条件筛选的经典写法方括号里放逻辑向量。负索引-(1:5)表示排除前 5 个元素如果向量长度刚好是 5排除后就空了。这些操作在数据清洗阶段用得极多建议逐条在 R 里跑一遍看输出。3.3 矩阵与数组的创建和索引文档第 2 章后段考矩阵操作。创建 3 行 4 列矩阵A可以用matrix(1:12, nrow3)也可以用array(1:12, dimc(3,4))还可以先建向量再设dim。矩阵索引A[2:3, 3:4]取的是第 2 到 3 行、第 3 到 4 列的子矩阵。apply(A, 2, sum)对每列求和apply(A, 1, sum)对每行求和。rbind()按行合并cbind()按列合并。# 创建矩阵 A - matrix(1:12, nrow 3) A # 取子矩阵 A[2:3, 3:4] # 取第一列 A[, 1] # 按列求和 apply(A, 2, sum) # 结果: 6 15 24 33 # 按行求和 apply(A, 1, sum) # 结果: 22 26 30 # 合并矩阵 B - matrix(13:24, nrow 3) rbind(A, B) # 按行合并6行4列 cbind(A, B) # 按列合并3行8列apply()的第二个参数是MARGIN1表示按行2表示按列。这个参数搞反了结果就完全不对而且不会报错。rbind和cbind要求两个矩阵的行数或列数匹配不匹配会报错。矩阵索引里如果只写一个维度比如A[,1]返回的是向量而不是矩阵需要加dropFALSE才能保持矩阵格式。4. 数据框、列表与控制流从数据结构到逻辑分支4.1 数据框的列访问方式与列表嵌套文档第 2 章末尾考数据框和列表。数据框df要取Height列df[Height]返回的是数据框df[[Height]]和df$Height返回的是向量。这三种写法结果类型不同在函数传参时如果搞混下游代码可能报错。数据框的列本质是向量列内类型一致列间类型可以不同——这是它和矩阵的核心区别。列表可以嵌套任意类型mylist[[2]][3]取的是列表第 2 个元素的第 3 个子元素。mylist[[3]][8]取的是第 3 个元素矩阵中的第 8 个值。双括号[[和单括号[的区别在于单括号返回子列表双括号返回元素本身。# 构造数据框 df - data.frame( Name c(Alice, Becka, James, Jeffrey, John), Sex c(F, F, M, M, M), Age c(13, 13, 12, 13, 12), Height c(56.5, 65.3, 57.3, 62.5, 59.0), Weight c(84.0, 98.0, 83.0, 84.0, 99.5) ) # 三种列访问方式 df[Height] # 返回数据框 df[[Height]] # 返回向量 df$Height # 返回向量 # 构造列表 v1 - c(10:18) v2 - c(a, b, c) m - matrix(1:9, nrow 3) f - factor(c(M, F, F, M)) mylist - list(v1, v2, m, f) # 访问列表元素 mylist[[2]][3] # c mylist[[3]][8] # 8 mylist[[3]][2, 3] # 矩阵第2行第3列的值df$Height最简洁但在函数内部用$访问列名有时会触发 R CMD check 的警告所以写包的时候更推荐df[[Height]]。列表的[[是递归索引[是子集索引这个区别在嵌套列表里尤其明显。4.2 控制流与自定义函数文档第 3 章考switch、if-else和自定义函数。switch(x, 35, 3*5, 3-5, 3**5)当x4时返回3**5即 243。if-else的花括号位置不影响执行但else必须和前面的}在同一行交互模式下否则 R 会误以为语句结束。自定义函数保存为.R文件后需要用source(myfun.R)加载才能调用。# switch 语句 x - 4 switch(x, 35 3 5, 3*5 3 * 5, 3-5 3 - 5, 3**5 3**5) # 结果: 243 # 自定义函数 common.statistics - function(x, type) { switch(type, mean mean(x), median median(x), sum sum(x), max max(x), min min(x)) } x - c(1, 2, 3, 4, 5, 6) common.statistics(x, mean) # 3.5 common.statistics(x, median) # 3.5 # 保存为 myfun.R 后加载 # source(myfun.R)switch在 R 里既可以按名称匹配也可以按位置匹配。按名称匹配时如果传入的名称没有对应分支返回NULL。source()的参数是文件路径字符串不是对象名。自定义函数内部用switch做分发是 R 里很常见的写法比一长串if-else清爽得多。5. 概率分布与统计推断从二项分布到假设检验的避坑清单5.1 常见分布及其 R 函数对应关系文档第 4 章考概率分布。二项分布X~B(n,p)的期望是np方差是np(1-p)。泊松分布X~P(λ)的期望和方差都是λ。均匀分布X~U(a,b)的期望是(ab)/2方差是(b-a)^2/12。正态分布X~N(μ,σ^2)的期望是μ方差是σ^2。指数分布的期望是1/λ方差是1/λ^2。在 R 里每种分布都有四个前缀函数d是密度函数p是累积分布函数q是分位数函数r是随机数生成函数。比如正态分布对应dnorm、pnorm、qnorm、rnorm。二项分布对应dbinom、pbinom、qbinom、rbinom。# 二项分布 dbinom(3, size 10, prob 0.5) # 恰好3次成功的概率 pbinom(3, size 10, prob 0.5) # 至多3次成功的累积概率 qbinom(0.5, size 10, prob 0.5) # 中位数对应的成功次数 rbinom(5, size 10, prob 0.5) # 生成5个随机数 # 正态分布 pnorm(1.96) # 标准正态累积概率 qnorm(0.975) # 95%分位数 rnorm(10, mean 0, sd 1) # 生成10个标准正态随机数 # 指数分布 pexp(2, rate 0.5) # 累积概率dbinom的size是试验次数prob是单次成功概率。pnorm默认是标准正态要算一般正态需要指定mean和sd。这些函数在模拟和假设检验里用得非常多建议把常用分布的四个前缀都过一遍。5.2 避坑清单R 基础操作里最容易翻车的五个点现象一1:n-1的结果和预期不符。原因冒号运算符优先级高于减号1:n-1实际是(1:n)-1。解决如果要生成1到n-1写1:(n-1)加括号。现象二df[Height]传给函数后报错。原因df[Height]返回的是数据框不是向量很多函数期望向量输入。解决用df[[Height]]或df$Height取向量。现象三rm(listls(pat^n))删错了对象。原因pat参数是正则表达式^n匹配所有以 n 开头的对象名包括你不想删的。解决先ls(pat^n)看一眼会匹配到哪些确认后再删。现象四source(myfun.R)后函数还是找不到。原因文件路径不对或者文件里函数名拼写和调用时不一致。解决用getwd()确认当前目录用file.exists(myfun.R)确认文件存在用ls()确认函数已加载。现象五apply(A, 1, sum)和apply(A, 2, sum)结果搞反。原因MARGIN1表示按行MARGIN2表示按列记混了。解决记住「1 横着走2 竖着走」或者先用小矩阵测试一下。6. 用这份试题做自测一个可复现的刷题与验证流程拿到这份 docx 之后我一般不会从头到尾读一遍就完事。更有效的做法是把它当成自测工具按下面的流程走一遍。第一步把文档里的题目按章节拆开先不看答案自己用 R 跑一遍。比如第 2 章的向量运算题直接在 R 控制台里输入表达式看输出和你的预期是否一致。不一致的地方就是你的知识盲区。第二步对于概念题比如数据类型判断、分布期望方差用 R 写一段验证代码。比如文档说均匀分布的方差是(b-a)^2/12你可以用var(runif(100000, min0, max1))模拟一下看结果是否接近1/12。# 验证均匀分布方差 set.seed(42) samples - runif(100000, min 0, max 1) var(samples) # 接近 1/12 ≈ 0.0833 (1 - 0)^2 / 12 # 理论值 # 验证二项分布期望 samples_binom - rbinom(100000, size 20, prob 0.3) mean(samples_binom) # 接近 20 * 0.3 6 20 * 0.3 # 理论期望 # 验证指数分布期望 samples_exp - rexp(100000, rate 2) mean(samples_exp) # 接近 1/2 0.5 1 / 2 # 理论期望set.seed()保证每次运行生成的随机数一致方便复现。runif的min和max参数指定均匀分布区间rbinom的size和prob对应二项分布的参数rexp的rate是 λ。模拟样本量越大样本统计量越接近理论值。第三步把做错的题目标记出来回到文档对应章节重新看概念。如果同一类错误反复出现比如总是搞混apply的MARGIN参数那就专门写一段代码反复练直到形成肌肉记忆。第四步对于假设检验和参数估计部分文档第 5 章文档只给了概念题没有给完整的数据分析流程。我一般会自己补一个完整案例用t.test()做单样本均值检验用chisq.test()做拟合优度检验用shapiro.test()做正态性检验。这些函数的输出里包含统计量、自由度、p 值和置信区间对照文档里的概念题一起看理解会更深。# 单样本 t 检验 set.seed(123) data - rnorm(30, mean 5, sd 2) t.test(data, mu 5) # 卡方拟合优度检验 observed - c(30, 20, 25, 25) chisq.test(observed) # 正态性检验 shapiro.test(data)t.test的mu参数是原假设的均值输出里的p-value小于 0.05 就拒绝原假设。chisq.test默认检验均匀分布要检验其他分布需要指定p参数。shapiro.test的 p 值大于 0.05 表示不能拒绝正态性假设。从那以后我每次拿到一份新的 R 试题或教程都会先跑一遍代码验证再对照答案查漏补缺最后把错题对应的知识点写成可执行的 R 脚本存下来。这份试题文档的价值不在于题目本身而在于它逼着你把那些「以为自己会了」的基础概念真正落到 R 代码里跑通。希望帮到你。本文还有配套的精品资源点击获取