☰
R语言常用函数汇总:数学统计、概率与字符处理全覆盖
2026/10/21 19:43:19 网站建设 项目流程

简介:面向数据分析和统计学习者的R语言常用函数速查手册,以PDF格式整理,适合刚接触R语言、备考数据分析岗位,或在建模前需要快速检索函数用法的读者。内容按数学、统计、概率、字符处理与其他实用函数五类系统展开,覆盖绝对值、平方根、取整与舍入等数学操作,均值、中位数、标准差、方差、分位数等统计指标,常见概率分布及其调用方式,以及字符串提取、查找、替换、连接等处理技巧,并收入序列生成、重复、分组、合并与随机数生成等实用功能,可作为日常编码和数据分析的随身参考。资源包含1个PDF文件,大小约50KB,轻便易存,适合离线查阅。目前已有294人学习下载,适合R语言入门者快速建立函数使用框架,也为进阶学习者提供集中复习清单;每类函数均按作用集中排列,便于按需翻阅。

1. 学 R 最容易踩的坑:不是函数难,而是查函数比学函数还费时间

刚接触 R 的人大多经历过这个场景:数据读进来了,头两行看着还行,想算个均值、中位数、标准差,却突然卡住——mean 还是 median?sd 还是 var?quantile 的 probs 参数到底写 0.25 还是 c(0.25, 0.5, 0.75)?再往后做点字符清洗,grep 和 sub 的正则表达式又把人绕晕。我见过不少同事,R 用了两三年,翻来覆去用的还是那五六个函数,不是因为别的,是每次想用新函数都懒得查、怕查不到、查到了也不知道参数怎么填。这份《R语言常用函数汇总》PDF 做的就是把高频函数按类别收拢在一起:数学、统计、概率、字符处理、数据操作全覆盖,拿到手可以直接照着敲。适合三类人:刚开始学 R 的初学者,备赛统计建模或数据分析项目的学生,以及经常要给数据做清洗和描述性统计的从业者。它给的不是代码仓库,是一份能塞进书包的函数地图。

2. 数学与统计函数:先搞懂边界条件,再谈计算

2.1 数学函数的使用边界

数学函数看着简单,其实最容易出问题的是边界行为。abs() 和 sqrt() 没什么好说的,但 ceiling() 和 floor() 的方向概念需要反复确认:ceiling(3.2) 返回 4,floor(3.2) 返回 3,ceiling(-3.2) 返回 -3,而 floor(-3.2) 返回 -4。很多人在负数上栽过跟头,因为语言习惯里“向上取整”容易理解成“往绝对值大的方向走”,实际上 ceiling 是向正无穷方向取整,floor 是向负无穷方向取整。round(x, digits=n) 的 n 是保留的小数位数而不是有效数字,round(1234.567, 2) 得到 1234.57,round(1234.567, -2) 会得到 1200,负数位数代表往整数高位舍入,这个特性在做数据展示时很好用,但第一次用的人会愣一下。signif(x, digits=n) 就可以直接处理有效数字:signif(0.0012345, 3) 得到 0.00123,这才是真正的有效数字舍入。

# 边界行为和参数区分示例 x <- c(3.2, -3.2, 1234.567, 0.0012345) # 向正无穷取整,不是向绝对值大的方向 print(ceiling(x[2])) # 输出 -3 # round 的 digits 为负数时,舍入到十位、百位 print(round(x[3], -2)) # 输出 1200 # signif 按有效数字位数舍入,不受小数位限制 print(signif(x[4], 3)) # 输出 0.00123

逻辑说明:这四行代码分别展示了 ceiling 对负数的处理方向、round 的负数 digits 含义、以及 signif 与 round 的本质区别。注意 round 的 digits 是小数位,signif 的 digits 是有效数字位,两者不要混用。参数说明:x 是数值型向量,digits 可以是负数,signif 的 digits 必须为正整数。

2.2 统计函数里的两个隐蔽参数

mean(x) 和 median(x) 属于必用项,但 mean 里有个关于缺失值的参数,很多人用了一年都没注意到。数据里出现 NA 时,mean(c(1, 2, NA)) 直接返回 NA,而不是跳过缺失后求均值。加 na.rm = TRUE 才会得到 1.5。这个参数在 sd()、var()、sum()、min()、max() 里同样生效,忘了写就是一片 NA。

quantile(x, probs) 的 probs 参数是 [0, 1] 区间的概率向量,默认是 c(0, 0.25, 0.5, 0.75, 1) 即五个分位点。需要自定义分位时,记得写 probs = c(0.05, 0.95) 这样的完整形式。另外 scale(x, center=TRUE, scale=TRUE) 这个函数是中心化和标准化的总入口:center=TRUE 表示每列减去均值,scale=TRUE 表示每列除以标准差,两个都 TRUE 就是 z-score 标准化。只想中心化不想标准化时,写 scale(x, center=TRUE, scale=FALSE)。

# 统计函数的缺失值处理和标准化 vec <- c(10, 20, NA, 40) # 默认返回 NA,需要显式声明 na.rm = TRUE print(mean(vec, na.rm = TRUE)) # 输出 25 # 自定义分位数 print(quantile(c(1:10), probs = c(0.1, 0.9))) # 输出 1.9 和 9.1 # 只中心化,不标准化 df <- data.frame(a = c(1, 2, 3), b = c(4, 5, 6)) print(scale(df, center = TRUE, scale = FALSE))

逻辑说明:第一个例子展示了缺失值处理的开关参数 na.rm;第二个例子说明 probs 可以接受任意位置的概率向量;第三个例子演示 scale 函数中 center 和 scale 两个逻辑参数的组合效果,中心化后的数据每列均值为 0。参数说明:na.rm 取 TRUE 或 FALSE,probs 是数值型向量,center 和 scale 是布尔值,默认均为 TRUE。

2.3 diff 和 difftime 的时间序列场景

diff(x, lag=n) 做滞后差分时,lag=1 表示相邻两项相减,lag=2 表示隔一项相减。在股价日收益率、气温变化率这类场景中非常常用。difftime(time1, time2, units=c("auto", "secs", "mins", "hours", "days", "weeks")) 是专门计算时间间隔的函数,注意两个 time 参数需要是 POSIXct 或 Date 类型,不是字符串。用 as.POSIXct() 转换后再传给 difftime,否则会报错或给出不可解释的结果。units 参数建议显式指定,auto 有时会给出出人意料的单位。

# 滞后差分和时间间隔计算 prices <- c(100, 102, 101, 105, 110) # 一阶差分表示相邻价格变化 print(diff(prices, lag = 1)) # 输出 2 -1 4 5 # 二阶差分表示变化量的变化 print(diff(prices, lag = 2)) # 输出 1 3 9 # 时间间隔:先转 POSIXct,再指定单位 t1 <- as.POSIXct("2024-01-01 08:00:00") t2 <- as.POSIXct("2024-01-01 10:30:00") print(difftime(t2, t1, units = "hours")) # 输出 2.5 hours

逻辑说明:diff 的结果向量长度是原向量长度减 lag;difftime 要求输入必须是时间类型对象,字符串必须先转换。参数说明:lag 默认为 1,units 建议从 mins、hours、days 等中显式选择,避免 auto 的不确定性。这里的时间格式是常见的 "YYYY-MM-DD HH:MM:SS",不同操作系统可能有差异。

3. 概率函数四件套:d/p/q/r 前缀决定一切

3.1 分布名称对照

这份 PDF 里列出了 19 种常见分布,beta、binom、cauchy、chisq、exp、f、gamma、geom、hyper、lnorm、logis、multinom、nbinom、norm、pois、signrank、t、unif、weibull、wilcox。每个分布名对应四个前缀函数,它们的命名规则是固定的:d 开头是密度函数,p 开头是分布函数,q 开头是分位数函数,r 开头是随机数生成函数。比如正态分布:dnorm(x, mean, sd) 算概率密度,pnorm(q, mean, sd) 算累积概率,qnorm(p, mean, sd) 算分位数,rnorm(n, mean, sd) 生成随机数。只要记住分布缩写,就可以推断出四个函数的函数名,这是 R 里最规律的一类函数。

3.2 分布函数与分位数函数的两两换算

pnorm 和 qnorm 是互逆操作。pnorm(1.96) 返回 0.975,而 qnorm(0.975) 返回 1.96。这在构造置信区间时非常关键,比如 95% 置信区间对应的 z 值是 qnorm(0.975) 而不是 qnorm(0.95)。同样地,t 分布的 qt(0.975, df = n-1) 在样本量小的时候会给出比 1.96 更大的值,这是 t 分布厚尾特性的直接体现。做假设检验或置信区间时,很容易忘记自由度参数,导致结果错误。

# 正态分布函数的互逆关系 # 已知分位点,求累积概率 p_val <- pnorm(1.96, mean = 0, sd = 1) print(p_val) # 输出接近 0.975 # 已知概率,反求分位点 q_val <- qnorm(0.975, mean = 0, sd = 1) print(q_val) # 输出接近 1.96 # t 分布与正态分布的分位数差异 print(qt(0.975, df = 10)) # 约 2.23,大于 1.96

逻辑说明:pnorm 和 qnorm 互为反函数,给定均值 mean 和标准差 sd 后可以互相推算。t 分布在小样本时尾部更厚,同样的 0.975 概率对应更大的临界值,这在样本量小于 30 时尤其要注意。参数说明:mean 和 sd 是分布参数,df 是自由度,必须为正值。

3.3 随机数生成:设置种子才可复现

rnorm(n, mean, sd) 和 runif(n, min, max) 在每次运行时产生的随机数都不同,这会导致分析结果无法复现。在写教学文档或跑模拟实验时,必须用 set.seed() 固定随机种子。set.seed(42) 之后再调用 rnorm,每次都会得到同一串随机数,这对调试和结果共享非常关键。一个常被忽略的细节是:set.seed 需要在每次生成随机数之前重新调用,而不是只在代码开头调用一次,如果中间有其他随机数生成操作,后续序列就会改变。

# 可复现的随机数生成 set.seed(123) rand_vals <- rnorm(5, mean = 0, sd = 1) print(rand_vals) # 再次设置相同种子,得到相同序列 set.seed(123) rand_vals_2 <- rnorm(5, mean = 0, sd = 1) print(rand_vals_2) # 与 rand_vals 完全相同 # 种子影响 scope:每次生成前都需要 set.seed set.seed(1) runif(3, min = 0, max = 100) set.seed(1) # 如果不重新设置,后续序列会不同 runif(3, min = 0, max = 100)

逻辑说明:set.seed 接收一个整数参数,之后第一次调用随机数生成函数时会返回固定序列。参数说明:概率密度函数中 x 是数值向量,分布函数中 q 是分位数向量,随机数生成函数中 n 是生成数量。runif 的 min 和 max 是区间端点,注意默认不包含 max。

4. 字符处理函数:正则表达式是分水岭

4.1 基础字符操作:nchar、substr、paste

nchar(x) 用来计算字符数量,注意中文字符在 R 的默认编码下按一个字计算,但在某些 Windows 系统上可能按两个字节计算,踩过这个坑的人不在少数。substr(x, start, stop) 的 start 和 stop 都是字符位置索引,从 1 开始计数,可以用于字串提取,也可以用于替换。paste() 是最常用的字符串拼接函数,默认用空格分隔,需要无分隔符拼接时用 paste0()。

# 字符长度和子串提取 text <- "数据分析" print(nchar(text)) # 输出 4 # 提取子串 print(substr("Hello World", 1, 5)) # 输出 Hello # 拼接字符串:注意 sep 与 paste0 的区别 print(paste("file", "2024", sep = "_")) # file_2024 print(paste0("file", "2024")) # file2024 print(paste(c("a", "b"), collapse = ",")) # a,b

逻辑说明:nchar 按字符计数,但受系统编码影响;substr 的 start 和 stop 都是闭区间;paste 的 sep 是连接多个向量元素时的分隔符,collapse 是把一个向量内的多个元素合并为单个字符串时的连接符。参数说明:paste 默认 sep 为空格,paste0 则固定无分隔,collapse 参数只在处理向量时使用。

4.2 grep 与 sub:正则查找和替换

grep() 在文本向量中查找匹配正则表达式的元素,返回匹配的索引,配合 value = TRUE 可以直接返回匹配的文本内容。sub() 做替换时需要注意:它只替换第一个匹配项,要替换全部匹配项需要 gsub()。正则表达式中的特殊字符如点号是万能匹配符,想匹配字面量点号必须用反斜杠转义。

# 正则表达式的查找和替换 emails <- c("alice@test.com", "bob@sample.org", "charlie@test.com") # 查找包含 test 的元素,返回原始文本 print(grep("test", emails, value = TRUE)) # 匹配任意字符:点号是通配符,需要转义才匹配字面量点号 print(grep("\\.", emails, value = TRUE)) # sub 只替换第一处,gsub 替换全部 print(sub("com", "cn", "test.com, test.com")) print(gsub("com", "cn", "test.com, test.com"))

逻辑说明:grep 的 value 参数决定返回的是索引还是原始文本;sub 和 gsub 的区别在于是替换第一个匹配还是全部匹配;正则表达式中 \\. 表示匹配字面量点号。参数说明:grep 的 pattern 支持正则表达式,ignore.case = TRUE 可以忽略大小写,fixed = TRUE 则按字面文本匹配不解析正则。

4.3 strsplit 的分隔符陷阱

strsplit(x, split, fixed=FALSE) 的 split 参数默认按正则表达式解析,这意味着如果你想按点号拆分字符串,直接写 split = "." 会得到空字符串,因为点号匹配任意单字符。解决方法是写 split = "\." 或设置 fixed = TRUE。这个细节几乎每个做文本清洗的人都会碰到一次,尤其是处理 IP 地址或文件后缀名时。

# 按点号拆分的正确姿势 ip <- "192.168.1.100" # 错误示范:split 默认是正则,点号匹配任意字符 print(strsplit(ip, ".")) # 得到空字符串列表 # 正确方法一:转义点号 print(strsplit(ip, "\\.")) # 正确方法二:fixed = TRUE 按字面匹配 print(strsplit(ip, ".", fixed = TRUE))

逻辑说明:strsplit 的 split 参数如果包含正则元字符,必须转义或设置 fixed = TRUE。返回值是一个列表,如果要对每个元素直接处理,往往配合 unlist() 使用。参数说明:fixed 默认 FALSE,当不需要正则解析时设置为 TRUE 会显著提升性能,同时避免转义烦恼。

5. 数据操作函数与常见问题:合并、命名、边界条件

5.1 合并函数 cbind 与 rbind 的行列数限制

cbind() 按列合并,要求所有数据对象行数相等;rbind() 按行合并,要求列数相等。这个约束经常在合并不同来源的数据时报错,最常见的错误信息是 "number of rows of matrices must match"。合并时还要注意数据类型:cbind 一个数值向量和一个字符向量会把数值强转为字符。这个行为很隐蔽,需要在合并且检查数据结构是否保持原样。

# 合并对象的维度约束 df1 <- data.frame(id = 1:3, score = c(88, 92, 95)) df2 <- data.frame(id = 4:6, score = c(76, 81, 79)) # 按行合并,要求列名一致 combined <- rbind(df1, df2) print(combined) # cbind 时如果行数不等,会循环补齐或报错 extra <- c(10, 20) # 不推荐:依赖循环补齐的隐式行为

逻辑说明:rbind 要求两个数据框的列名和列数完全一致,否则结果列对不齐。cbind 的行数必须匹配,长度不足时 R 会自动循环补齐,这会让数据意外重复,建议合并前先用 nrow() 检查维度。参数说明:cbind 和 rbind 都接受数据框、矩阵或向量,返回类型取决于输入类型。

5.2 rownames 与 colnames 的重命名细节

rownames() 和 colnames() 用于修改行名和列名。注意 colnames() 返回的是列名的字符向量,直接用下标赋值即可。修改行名时行名的长度必须与数据框行数一致,否则报错。还有一个常用操作是将第一个列设为行名,用到 rownames(df) <- df$id,然后再删除 id 列,这在处理带有 ID 列的数据时非常常见。

# 修改列名和行名的标准操作 df <- data.frame(a = 1:3, b = 4:6) # 整体赋值列名 colnames(df) <- c("x", "y") # 单独修改一个列名 colnames(df)[1] <- "new_x" # 行名整体赋值 rownames(df) <- c("row1", "row2", "row3") # 把某列设为行名 df2 <- data.frame(id = c("A", "B"), val = c(10, 20)) rownames(df2) <- df2$id df2$id <- NULL print(df2)

逻辑说明:列名和行名本质是向量的 names 属性,直接赋值即可。注意 rownames 赋值时长度必须匹配,否则报错。把 id 列设为行名后删除原列,是数据清洗中常用的索引方式。参数说明:NULL 赋值可以删除整个列,df$id <- NULL 是删除列的快捷方式。

5.3 length、seq、rep、cut、pretty 的组合用法

length(x) 获取元素个数;seq(from, to, by) 生成等差数列,注意 by 可以是负数用于倒序生成;rep(x, n) 将整个向量重复 n 次,如果要重复每个元素需要用 times 参数或 each 参数。cut(x, n) 将连续变量分割为因子,默认生成的是因子类型,后续分析中可能需要用 as.numeric() 转换。pretty(x, n) 创建美观的间隔点,经常用于绘图坐标轴的刻度设置。

# 序列生成和重复的组合使用 # 从 0 到 1 间隔 0.2 print(seq(0, 1, by = 0.2)) # 重复整个向量 n 次 print(rep(c("A", "B"), times = 3)) # 重复每个元素各 n 次 print(rep(c("A", "B"), each = 3)) # cut 将连续变量分箱 values <- c(1, 5, 9, 15, 22, 30) bins <- cut(values, breaks = 3) print(bins) print(levels(bins))

逻辑说明:seq 的 by 参数决定步长,可以是小数;rep 的 times 重复整个向量,each 重复每个元素后再进入下一个元素;cut 的 breaks 参数可以是数字表示分箱数量,也可以是向量指定断点。参数说明:cut 返回因子类型,可以用 labels = FALSE 直接返回整数索引。

5.4 避坑:三个容易翻车的小细节

坑一:sep 和 seq 混淆导致报错

现象:照着笔记敲代码,把 seq(1, 10, by = 2) 写成了 sep(1, 10, by = 2),提示找不到函数。原因:sep 是 paste 里的分隔符参数,不是函数名,文档中出现的 "sep(fom,to,by)" 可能是 OCR 识别错误,正确函数名是 seq。解决:统一使用 seq(from, to, by) 写法,不要被资料中的笔误干扰。

坑二:scale 函数的 center 和 scale 参数带引号

现象:调用 scale(df, center = "TRUE", scale = TRUE) 后结果不正确,数据没有被中心化。原因:center 和 scale 是逻辑参数,应该写 TRUE 或 FALSE,如果写成字符串 "TRUE" 会被当作字符向量处理,函数行为异常。解决:始终写 scale(df, center = TRUE, scale = TRUE),不写引号。这个错误在从 Excel 或其他语言转过来的用户中非常常见。

坑三:paste 默认空格分隔导致输出与预期不一致

现象:paste("file", "2024") 输出 "file 2024" 而不是 "file2024"。原因:paste 默认 sep 参数为空格,而很多人潜意识认为拼接就是无缝连接。解决:需要无缝拼接时使用 paste0(),或显式指定 sep = ""。另一个相关坑是 paste 处理向量时如果忘了 collapse 参数,会输出多个元素而不是一个合并字符串,导致后续匹配失败。

6. 现学现用的落地技巧:用这套函数做一份完整的数据描述报告

掌握了函数不等于会做分析,关键是要能把函数组合起来处理真实场景。这里给一个可以直接套用的组合模式:读取一份数据后,用统计函数算描述性指标,用字符函数清洗列名,用概率函数生成模拟数据验证分析流程,最后用 seq 和 cut 完成分箱可视化。

# 模拟 100 个服从正态分布的观测值 set.seed(42) scores <- rnorm(100, mean = 75, sd = 10) # 基础描述性统计 summary_stats <- c( mean = mean(scores), median = median(scores), sd = sd(scores), min = min(scores), max = max(scores) ) print(round(summary_stats, 2)) # 分位数 print(quantile(scores, probs = c(0.05, 0.25, 0.75, 0.95))) # 分箱并统计频数 bins <- cut(scores, breaks = seq(40, 110, by = 10)) print(table(bins)) # 中心化后求各列均值验证为 0 df_scores <- data.frame(scores) scaled <- scale(df_scores, center = TRUE, scale = TRUE) print(colMeans(scaled))

逻辑说明:set.seed 保障结果可复现;rnorm 生成模拟数据;mean、median、sd、min、max 组合成一个命名向量输出;quantile 用于观察分布尾部;cut 配合 seq 将分数分成 40-50、50-60 等区间;scale 中心化后列均值接近 0,用于验证代码正确性。参数说明:rnorm 的 n 是样本量,mean 和 sd 是正态分布参数;colMeans 对数据框或矩阵按列求均值。

这个组合之所以好用,是因为它覆盖了数据分析最常用的五个环节:生成数据、描述分布、观察分位数、分箱统计、验证标准化效果。拿到任何一份连续型数值数据,都可以把这套流程直接跑一遍,得到的结果就是一份基础数据体检报告。

如果这份 PDF 里能扩展,我会建议补充三块:一是数据导入相关的 read.csv 和 read.table 的参数说明,尤其是 header、stringsAsFactors、fileEncoding 这三个参数;二是 apply 系列函数,包括 apply、lapply、sapply 的返回类型区别,这是从入门到进阶的分水岭;三是日期处理 like as.Date 和 format 的组合用法。这三块是真实工作中每天都会碰到的,前两块甚至比概率函数中的某些冷门分布更常用。

说到底,R 的学习路径永远不是从头到尾背函数名,而是把这份清单当作地图,遇到问题按图索骥,查完即用,用完即忘。从那以后我每次给人讲 R 的基础操作,都会强制先让他们过一遍这份函数清单,标注出自己不懂的类别,然后拿模拟数据跑完这一整套流程。确认没报错后再开始正式数据分析。这个过程能过滤掉八成的基础错误,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询