R语言核心函数速查指南:从数据导入到可视化与流程控制
2026/7/30 2:36:57 网站建设 项目流程

1. 从“无法识别”到“信手拈来”:为什么你需要这份R函数清单

如果你在命令行里敲下R却得到“无法识别”的提示,或者在RStudio里想画个图却连plot的参数都记不全,别慌,这几乎是每个R语言新手都会经历的阶段。从“无法将‘R’项识别为cmdlet、函数、脚本文件或可运行程序的名称”这种环境配置的挫败,到面对causalweight包为何装不上、forecast程序包怎么加载这类依赖问题的迷茫,再到真正开始写代码时,对着满屏的函数名大脑一片空白——这个学习曲线确实有点陡。

但我想告诉你的是,R语言的核心魅力,很大程度上就封装在这些看似繁杂的函数里。它不像Python那样追求“一种方法只做一件事”的极简哲学,R的函数生态更像一个精心布置的工具箱,针对数据操作、统计建模、可视化等特定领域,提供了大量开箱即用、功能强大的“瑞士军刀”。掌握其中最关键的一批,你就能立刻从“安装都费劲”的新手,变成能解决实际数据分析问题的“战力”。网络上搜索“R语言入门”的人,真正需要的不是一本厚重的语法手册,而是一份能立刻上手、覆盖数据处理全流程的“核心函数速查指南”。今天,我就结合自己从命令行报错一路走来的经验,为你梳理出50个最常用、最核心的R函数,并解释清楚每个函数“为什么”要这么用,以及在实际操作中会“踩到”哪些坑。

这份清单不会面面俱到,但力求精准。它会帮你绕过那些晦涩的、使用频率极低的函数,直击数据处理、统计分析、图形绘制和流程控制中的高频需求。当你再遇到数据不知如何下手时,这份清单就是你的第一张“寻宝图”。

2. 数据操作的基石:读写、查看与子集选取

数据分析的第一步永远是“把数据弄进来,然后看看它长什么样”。这个环节的函数看似基础,但用不好就会为后续分析埋下无数隐患,比如字符编码错误、数值类型误判、或者不小心修改了原始数据。

2.1 数据读写:不仅仅是read.csv()

读入数据是万里长征第一步。read.csv()read.table()是最常用的函数,但很多人只停留在默认参数。

# 基础读入 my_data <- read.csv("data.csv") # 更稳健的读入方式(应对常见问题) my_data <- read.csv("data.csv", header = TRUE, # 第一行是列名 stringsAsFactors = FALSE, # 重要!防止字符自动转因子 na.strings = c("NA", "", "NULL", "NaN"), # 定义缺失值 fileEncoding = "UTF-8") # 指定文件编码,解决中文乱码

这里有几个关键点:

  • stringsAsFactors = FALSE:在R 4.0.0之前,这是至关重要的参数。R默认会将文本列(字符串)转换为“因子”(factor),这是一种分类变量。对于真正的文本数据(如姓名、地址),这会导致不必要的麻烦和错误。虽然新版R默认已改为FALSE,但显式声明是个好习惯,也能保证代码在老版本上的兼容性。
  • na.strings:数据中的缺失值可能以多种形式存在(空单元格、”NA”、”NULL”)。这个参数告诉R,哪些字符串应该被识别为缺失值(NA),避免把“NA”这个字符串当成有效文本。
  • fileEncoding:处理中文或特殊字符数据时乱码的罪魁祸首。通常尝试”UTF-8″或”GBK”。

对于Excel文件,我强烈推荐readxl包中的read_excel(),它无需依赖Java,速度更快,对.xlsx支持更好。

library(readxl) excel_data <- read_excel("data.xlsx", sheet = 1) # sheet可以是名称或索引

写出数据则用write.csv()write.table()。注意,默认情况下write.csv()会写入行名(row.names),这通常不是我们想要的,记得设为FALSE

write.csv(my_data, "cleaned_data.csv", row.names = FALSE)

2.2 数据审视:用“眼睛”和“函数”同时诊断

数据读进来后,不要急着分析。先用一组函数快速“扫描”它。

  • head()/tail()/View()head(data)查看前6行,tail(data)查看后6行,这是快速预览。在RStudio中,View(data)会打开一个类似Excel的图形化查看器,非常直观。
  • str()结构(Structure)。这是我最爱用的诊断函数之一。它一次性输出对象的类型、维度、以及每列的数据类型和前几个值。
    str(my_data) # 输出示例:'data.frame': 150 obs. of 5 variables: # $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... # $ Species : chr "setosa" "setosa" "setosa" "setosa" ...
    一眼就能看出my_data是一个150行5列的数据框,Sepal.Length是数值型,Species是字符型。这比class()只返回一个类型有用得多。
  • summary()摘要统计。对数值列,给出最小值、四分位数、均值、最大值;对因子或字符列,给出频数。能快速发现异常值(比如最大值远大于上四分位数)。
    summary(my_data$Sepal.Length) # Min. 1st Qu. Median Mean 3rd Qu. Max. # 4.300 5.100 5.800 5.843 6.400 7.900
  • names()/colnames():获取或设置数据框的列名。names(data)更通用。
  • dim()/nrow()/ncol():获取对象的维度、行数、列数。dim(data)返回一个包含行数和列数的向量。

2.3 数据子集选取:方括号[ ]、美元符号$subset()

从数据框中提取部分数据是日常操作,主要有三种方式。

  1. 按行列索引选取(方括号[ , ]:最灵活。

    data[1, ] # 第1行,所有列 data[, 2] # 所有行,第2列(返回向量) data[1:5, c(“col1”, “col3”)] # 第1-5行,”col1″和”col3″列 data[data$age > 18, ] # 逻辑索引:选取age大于18的所有行
  2. 按列名选取(美元符号$:最快捷,用于提取单列(返回向量)。

    data$age # 提取名为age的列
  3. subset()函数:语法更易读,尤其适合基于条件的筛选,并且会自动忽略筛选条件中的NA值。

    subset(data, age > 18 & city == “Beijing”, select = c(name, income)) # 选取 age>18 且 city为北京 的行,只保留 name 和 income 列

注意:方括号选取多列时,如果只选一列且drop=TRUE(默认),R会将其“降维”成一个向量。这有时会导致后续函数出错。为了避免这种情况,可以在方括号内加drop=FALSE参数,或者使用subset()

3. 数据清洗与转换:从混乱到规整

原始数据几乎总是“脏”的。清洗和转换是让数据变得可分析的关键步骤,这组函数是你的“清洁工具箱”。

3.1 处理缺失值:识别、删除与填补

  • is.na():检测缺失值,返回一个逻辑向量(TRUE/FALSE)。注意x == NA这种写法是错的,永远返回NA。必须用is.na(x)
    sum(is.na(data$column)) # 计算该列缺失值总数 which(is.na(data$column)) # 找出缺失值所在的位置(行索引)
  • na.omit():删除包含任何缺失值的整行。简单粗暴,但可能损失大量数据。
    data_clean <- na.omit(data)
  • complete.cases():返回一个逻辑向量,标记哪些行是完整的(无缺失值)。可以用于更精细的控制。
    data_complete <- data[complete.cases(data), ]

对于缺失值填补,R基础包功能有限,通常会用到mean(),median()或更复杂的包如mice。基础操作如下:

data$column[is.na(data$column)] <- mean(data$column, na.rm = TRUE) # 用该列的均值(忽略NA计算)填补缺失值

3.2 类型转换与创建:as.系列与factor()

R是强类型语言,数据类型不对,很多操作无法进行。

  • as.numeric()as.character()as.Date():进行类型转换。

    x <- c(“1”, “2”, “3”) x_num <- as.numeric(x) # 字符转数值

    常见坑:将因子(factor)直接as.numeric()会得到因子的内部编码(整数),而不是它显示的标签值。正确做法是先转字符,再转数值:as.numeric(as.character(factor_var))

  • factor():将向量转换为因子(分类变量)。对于有限的离散类别(如性别、省份),存储为因子更高效,且是许多统计模型(如线性回归、方差分析)所要求的。

    gender <- c(“M”, “F”, “M”, “F”, “M”) gender_factor <- factor(gender, levels = c(“F”, “M”)) # 指定水平顺序 # levels的顺序会影响模型中因子的参照水平和图形中因子的排列顺序

3.3 排序、去重与匹配

  • order()/sort()sort(x)直接对向量排序并返回结果。order(x)返回的是排序后元素在原向量中的索引位置,这个功能更强大,常用于数据框排序。
    data[order(data$age, -data$income), ] # 按age升序,income降序排列
  • unique():返回向量中的唯一值。
  • duplicated():标记向量或数据框行中的重复元素(从第二个重复项开始标记为TRUE)。
    data[!duplicated(data$id), ] # 基于id列去重,保留第一个出现的
  • match():匹配函数,返回第一个向量中每个元素在第二个向量中的位置。它是%in%的底层实现,但功能更强。
    x <- c(“A”, “B”, “C”) y <- c(“C”, “A”, “B”) match(x, y) # 返回: 2 3 1 (x中的”A”在y的第2个位置)
  • %in%:判断元素是否在集合中,返回逻辑向量。非常常用。
    data[data$city %in% c(“Beijing”, “Shanghai”, “Guangzhou”), ] # 筛选城市为北上广的数据

3.4 字符串处理基础:paste()substr()grep()

R的基础字符串处理函数不如Python的str方法直观,但足够应对基本需求。

  • paste()/paste0():连接字符串。paste(..., sep=” “)默认用空格分隔,paste0(...)paste(..., sep=””)的简写,直接拼接。
    paste(“Hello”, “World”) # “Hello World” paste0(“file_”, 1:3, “.csv”) # c(“file_1.csv”, “file_2.csv”, “file_3.csv”)
  • substr():提取或替换子字符串。
    x <- “abcdef” substr(x, 2, 4) # 提取:”bcd” substr(x, 2, 4) <- “XXX” # 替换:x变为 “aXXXef”
  • grep()/grepl():基于正则表达式进行模式匹配。grep(pattern, x)返回匹配项的索引grepl(pattern, x)返回逻辑向量(TRUE/FALSE)。
    files <- c(“data.csv”, “plot.png”, “script.R”, “notes.txt”) grep(“\\.R$”, files) # 匹配以.R结尾的文件名,返回索引 3 grepl(“\\.(csv|txt)$”, files) # 匹配以.csv或.txt结尾,返回逻辑向量
    对于复杂的字符串处理,建议学习stringr包,其函数名和逻辑更清晰一致。

4. 数学、统计与向量化计算

R诞生于统计学领域,其核心优势就在于向量化运算和丰富的统计函数。理解这些函数,才能发挥R的真正威力。

4.1 基础数学与统计函数

这些函数大多能直接对向量、矩阵或数据框的列进行运算,返回一个聚合结果。

  • sum()mean()median()sd()(标准差),var()(方差),min()max():基础统计量。关键参数是na.rm = TRUE/FALSE,用于指定是否在计算前移除缺失值。
    mean(data$income, na.rm = TRUE) # 计算收入均值,忽略NA
  • range():返回最小值和最大值。
  • quantile():计算分位数。
    quantile(data$age, probs = c(0.25, 0.5, 0.75)) # 计算下、中、上四分位数
  • table():构建列联表,用于分类变量的频数统计。这是探索性数据分析的利器。
    table(data$gender, data$education) # 生成性别*教育程度的交叉表
  • prop.table():将table()的结果转换为比例表。
    tab <- table(data$gender) prop.table(tab) # 计算性别比例
  • scale():对数据进行标准化(中心化或缩放),即计算Z-score。这是许多机器学习算法预处理的标准步骤。
    data_scaled <- scale(data[, c(“age”, “income”)]) # 对年龄和收入列标准化

4.2 向量化运算与apply函数族

R的循环(for,while)效率较低。向量化运算和apply族函数是更高效、更“R风格”的选择。

  • 向量化运算:运算符和函数能直接对整个向量进行操作。

    x <- 1:5 y <- 6:10 x + y # 对应元素相加: 7, 9, 11, 13, 15 x > 3 # 逻辑比较: FALSE FALSE FALSE TRUE TRUE log(x) # 对每个元素取对数
  • apply():对数组(矩阵、数据框)的行或列应用一个函数。

    m <- matrix(1:12, nrow=3) apply(m, 1, sum) # 对每一行(margin=1)求和 apply(m, 2, mean) # 对每一列(margin=2)求均值

    对于数据框,apply会强制将所有列转换为同一类型(通常为字符型),可能丢失信息,需谨慎。

  • lapply():对列表(list)或向量每个元素应用函数,返回一个列表(list)。这是最常用的一个。

    my_list <- list(a=1:3, b=4:6) lapply(my_list, mean) # 返回列表,包含a和b的均值
  • sapply()lapply()的简化版,尝试将结果简化为向量或矩阵。

    sapply(my_list, mean) # 返回一个命名向量
  • tapply():根据一个或多个因子(分组变量)对向量进行分组,然后对每组应用函数。非常适用于分组汇总。

    # 按性别分组,计算各组的平均收入 tapply(data$income, data$gender, mean, na.rm=TRUE)

实操心得apply族函数初学有点绕,但掌握后代码会简洁高效很多。记住lapply用于列表循环,sapply试图简化结果,apply用于矩阵行列,tapply用于分组计算。现代R编程中,purrr包提供了更一致、更强大的映射函数,但掌握基础apply族仍是理解R思维的关键。

5. 图形绘制入门:让数据开口说话

R的图形系统是其另一大招牌。基础绘图函数plot()虽然简陋,但功能全面,是理解R绘图逻辑的起点。

5.1 基础绘图函数plot()及其参数

plot()是一个泛型函数,根据输入数据类型自动生成不同类型的图。

# 散点图 (两个数值向量) plot(x = data$age, y = data$income, main = “年龄与收入关系”, # 主标题 xlab = “年龄”, # x轴标签 ylab = “收入”, # y轴标签 col = “blue”, # 点颜色 pch = 16) # 点形状(16是实心圆) # 如果x是因子,则生成箱线图 plot(data$gender, data$income) # 按性别绘制收入的箱线图

关键图形参数:

  • type:图形类型。”p”点,”l”线,”b”点线,”h”垂直线,”s”阶梯线等。
  • col:颜色。可以用颜色名(如”red”, “blue”),也可以用RGB值rgb(0,0,1)或十六进制”#FF0000″
  • pch:点的形状,1-25是标准形状。
  • lty:线的类型,1实线,2虚线等。
  • lwd:线的宽度。
  • xlimylim:坐标轴范围,如xlim = c(0, 100)
  • cex:图形元素的缩放倍数。cex=1.5表示放大1.5倍。

5.2 图形修饰与组合

一张图往往需要添加多种元素。

  • points()lines()abline():在现有图形上添加点、线或参考线。
    plot(x, y) points(x_new, y_new, col=”red”, pch=17) # 添加新点,红色三角形 abline(h = mean(y), col=”gray”, lty=2) # 添加水平均值虚线 abline(lm(y ~ x), col=”red”) # 添加回归线
  • legend():添加图例。位置参数legend可以是”topleft””bottomright”等,也可以是坐标c(x, y)
    legend(“topleft”, legend=c(“Group A”, “Group B”), col=c(“blue”, “red”), pch=c(16, 17))
  • par():图形参数设置函数,用于控制全局绘图设置,如边距、图形排列等。一个非常重要的技巧mfrowmfcol参数可以创建多图布局。
    par(mfrow = c(2, 2)) # 将画布分割为2行2列,共4个子图 plot(1) # 绘制在第1个位置(左上) plot(2) # 绘制在第2个位置(右上) plot(3) # 绘制在第3个位置(左下) plot(4) # 绘制在第4个位置(右下) par(mfrow = c(1, 1)) # 恢复为单图模式
  • hist():绘制直方图,用于查看数值变量的分布。
    hist(data$income, breaks=20, col=”lightblue”, main=”收入分布直方图”, xlab=”收入”)
  • boxplot():绘制箱线图,用于查看分组数据的分布和异常值。
    boxplot(income ~ gender, data=data, col=c(“pink”, “lightblue”)) # 按性别分组绘制收入箱线图
  • barplot():绘制条形图,常用于展示分类变量的频数或汇总值。
    counts <- table(data$education) barplot(counts, main=”教育程度分布”, col=”steelblue”)

踩坑提醒plot()默认会开启一个新的图形设备。如果你在循环中绘图,要么用par(mfrow)提前布局,要么在每次plot()前使用dev.new()打开新窗口,否则后面的图会覆盖前面的。对于更复杂、更精美的图形,ggplot2包是行业标准,其“图形语法”理念强大而一致,强烈建议在掌握基础绘图后深入学习。

6. 流程控制与函数编写:从脚本到工具

当你需要重复执行某些操作,或者将一段功能独立的代码封装起来时,就需要流程控制语句和自定义函数。

6.1 流程控制:ifforwhile

  • ifelse ifelse:条件判断。

    score <- 85 if (score >= 90) { grade <- “A” } else if (score >= 80) { grade <- “B” } else { grade <- “C” }

    R中还有一个向量化的ifelse(test, yes, no)函数,非常高效。

    data$pass <- ifelse(data$score >= 60, “Pass”, “Fail”)
  • for (variable in sequence):循环。在R中,应尽量避免在数据量大的情况下使用显式循环,优先考虑向量化或apply族函数。但在初始化、迭代操作等场景下仍有用。

    for (i in 1:5) { print(paste(“Iteration”, i)) }
  • while (condition):当条件为真时循环。

    x <- 1 while (x < 5) { print(x) x <- x + 1 }

6.2 自定义函数:function()

将重复代码块封装成函数,是提高代码可读性、可维护性和复用性的关键。

# 定义一个计算变异系数(CV)的函数 coefficient_of_variation <- function(x, na.rm = FALSE) { # 函数体开始 if (na.rm) { x <- x[!is.na(x)] # 如果na.rm为TRUE,移除NA } if (length(x) == 0) { return(NA) # 处理空向量的情况 } sd_val <- sd(x) mean_val <- mean(x) if (mean_val == 0) { return(NA) # 避免除零错误 } cv <- sd_val / mean_val return(cv) # 返回计算结果 # 函数体结束 } # 使用函数 my_vector <- c(10, 20, 30, NA, 50) result <- coefficient_of_variation(my_vector, na.rm = TRUE) print(result)

函数定义要点:

  1. function(arg1, arg2, ...):使用function()关键字定义,括号内是参数列表。
  2. 参数默认值:如na.rm = FALSE,调用时可省略。
  3. 函数体:用花括号{}括起来的一系列R表达式。
  4. 返回值:函数体中最后一条语句的值会自动返回,也可以用return()显式返回。
  5. 作用域:函数内部创建的变量是局部变量,函数执行完毕后即消失,不会影响外部环境。

6.3 实用工具函数

  • setwd()/getwd():设置和获取当前工作目录。这是管理项目文件的基础。建议在脚本开头使用setwd(),或使用RStudio的Projects功能来管理。
  • ls():列出当前工作环境中的所有对象。
  • rm():删除对象。rm(list = ls())会清空当前环境(谨慎使用!)。
  • library()/require():加载R包。library(pkg)加载失败会报错,require(pkg)加载失败会返回FALSE并警告。在函数内部通常用require(),在脚本开头用library()
  • install.packages():安装CRAN上的包。可以一次安装多个:install.packages(c(“dplyr”, “ggplot2”))
  • source():执行一个R脚本文件。常用于加载自定义函数或配置。
  • help()/?:查看函数帮助文档。?meanhelp(“mean”)??用于模糊搜索,如??regression
  • example():运行函数示例,快速了解用法,如example(plot)

7. 进阶函数与概念初探

当你熟悉了以上基础函数后,以下这些函数和概念将帮助你解决更复杂的问题,并写出更地道的R代码。

7.1which()which.max()which.min()

  • which():返回逻辑向量中为TRUE的元素的索引。它比grep()更通用,不限于字符串。

    x <- c(10, 20, 30, 40) which(x > 25) # 返回: 3 4 # 结合逻辑条件进行筛选 data[which(data$age > 30 & data$city == “Shanghai”), ]

    注意which()会忽略NA。有时直接使用逻辑索引data[condition, ]就足够了,which()在处理复杂条件或需要明确索引时更有用。

  • which.max()/which.min():返回向量中最大(小)值第一次出现的位置索引。

    x <- c(3, 1, 4, 1, 5) which.max(x) # 返回 5 (最大值5在第5个位置) which.min(x) # 返回 2 (最小值1第一次出现在第2个位置)

7.2split()unsplit()

split()根据一个因子将向量、数据框或列表分割成一个列表,列表的每个元素对应一个因子水平的数据子集。它是tapply的底层操作之一,也是“拆分-应用-合并”策略的关键。

# 使用内置数据集iris data(iris) # 按Species列分割数据框 iris_split <- split(iris, iris$Species) # 现在iris_split是一个列表,包含三个数据框:setosa, versicolor, virginica str(iris_split) # 可以对每个子集进行操作 lapply(iris_split, function(df) mean(df$Sepal.Length)) # unsplit() 可以将split的结果(列表)合并回原来的顺序 iris_combined <- unsplit(iris_split, iris$Species)

7.3with()within()

这两个函数可以创建一个临时的数据环境,避免反复使用$[[]]来提取列,使代码更简洁。

  • with(data, expr):在data的上下文环境中计算表达式expr。常用于绘图或简单计算。
    # 不使用with plot(iris$Sepal.Length, iris$Sepal.Width) # 使用with with(iris, plot(Sepal.Length, Sepal.Width))
  • within(data, expr):与with类似,但允许修改数据,并返回修改后的数据对象。常用于创建或修改数据框的列。
    iris_new <- within(iris, { Sepal.Ratio <- Sepal.Length / Sepal.Width # 创建新列 Large.Petal <- Petal.Length > 5 # 创建逻辑列 })

7.4 随机数函数:set.seed()sample()rnorm()

可重复性是科学研究的基础。R的随机数函数在模拟和抽样中至关重要。

  • set.seed():设定随机数种子。只要种子相同,后续的随机操作(如sample()rnorm())产生的序列就是完全相同的。这保证了结果的可重复性。
    set.seed(123) # 设定种子为123 x <- rnorm(5) # 生成5个随机数 # 无论运行多少次,只要种子是123,x的值就固定不变
  • sample():从向量中随机抽样。
    sample(1:10, 5) # 从1-10中无放回地抽取5个数 sample(1:10, 5, replace = TRUE) # 有放回抽样 sample(c(“A”, “B”, “C”), 10, replace = TRUE, prob = c(0.5, 0.3, 0.2)) # 加权抽样
  • rnorm()runif()rbinom():生成来自特定分布的随机数。rnorm(n, mean, sd)生成正态分布随机数,runif(n, min, max)生成均匀分布随机数,rbinom(n, size, prob)生成二项分布随机数。

掌握这50个函数,你就能覆盖R语言日常数据分析中80%以上的操作。从数据导入、清洗、探索、可视化到简单的流程控制和函数封装,这条路径已经打通。剩下的,就是在具体项目中不断练习,并针对特定领域(如时间序列的forecast包、网络分析的igraph包)去深入学习相应的扩展包。记住,学习R函数的最佳方式不是背诵,而是在解决实际问题的过程中反复查阅、使用和理解它们。当你再看到causalweight包安装报错时,你至少会想到用install.packages(“causalweight”, dependencies=TRUE)或者去检查一下R版本和系统环境,而不是手足无措了。

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

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

立即咨询