目录
1. 基础包数据读写:read.table与write.table
2. 长宽数据转换:pivot_longer与pivot_wider
一、数据导入与导出:快速读写数据
1. 基础包数据读写:read.table
与write.table
install.packages("tidyverse")
library(tidyverse)
# CSV文件导入(交互式选择文件)
rawdata <- read.table(file.choose(), header = TRUE, sep = ",")
# header=TRUE: 将首行作为列名
# sep=",": 分隔符为逗号(适用于CSV格式)
# 查看数据前4行
head(rawdata, n=4)
# 查看数据后10行
tail(rawdata, n=10)
# 提取95-100行
rawdata[95:100, ]
# 查看数据结构
str(rawdata)
# 数据导出为CSV(不保留行号)
write.table(rawdata, "test.csv", sep = ",", row.names = FALSE)
2. 高效数据读取:data.table::fread
# 安装data.table包(读取速度比read.table快10-100倍)
install.packages("data.table")
library(data.table)
# 快速读取CSV
rawdata_fast <- fread(file.choose())
3. Excel 文件读取:readxl
包
install.packages("readxl")
library(readxl)
# 交互式读取Excel文件(支持.xlsx/.xls)
exc <- read_excel(file.choose())
4. 批量读取文件:list.files
# 获取当前目录下所有CSV文件
files <- list.files(path = "./data", pattern = ".csv$", full.names = TRUE)
# path: 指定目录路径
# pattern: 正则表达式筛选文件(如".csv$"表示以.csv结尾)
# full.names: 返回完整路径
# 批量读取并合并
all_data <- lapply(files, read.csv) %>% bind_rows()
二、数据清洗:筛选、转换与分组
1. 数据框操作:dplyr
包核心函数
install.packages("dplyr")
library(dplyr)
# 示例数据集:ToothGrowth(豚鼠牙齿生长数据)
data(ToothGrowth)
head(ToothGrowth)
# 1. 新增变量与变量转换
tooth2 <- mutate(ToothGrowth,
Ten = len^2, # 平方值
nv = 1:nrow(ToothGrowth), # 行号
nv2 = ifelse(nv > median(nv), "H", "L") # 中位数分组
)
# 2. 筛选行(filter)
tooth3 <- filter(tooth2,
nv %in% 1:50, # nv在1-50之间
nv2 == "H" # 分组为H
)
# 3. 筛选列(select)
tooth4 <- select(tooth3, supp, dose) # 选择supp和dose列
tooth4 <- select(tooth3, 2:4) # 选择第2-4列
2. 分组汇总:group_by
与summarise
# 全局汇总
summarise(ToothGrowth,
len_max = max(len), # 最大值
len_min = min(len) # 最小值
)
# 按supp分组汇总
ToothGrowth %>%
group_by(supp) %>% # 按supp分组
summarise(len_mean = mean(len)) # 计算每组均值
# 多变量分组(dose+supp)
ToothGrowth %>%
group_by(dose, supp) %>%
summarise(
len_max = max(len),
n = n() # 计数
)
3. 管道操作:%>%
简化代码
# 传统写法
step1 <- filter(ToothGrowth, dose > 0.5)
step2 <- group_by(step1, supp)
step3 <- summarise(step2, mean_len = mean(len))
# 管道写法(更简洁)
result <- ToothGrowth %>%
filter(dose > 0.5) %>%
group_by(supp) %>%
summarise(mean_len = mean(len))
三、数据合并:多表连接与整合
1. 数据框连接:dplyr
连接函数
# 创建示例数据框
df1 <- data.frame(c1 = 2:5, c2 = letters[2:5]) # c2: b,c,d,e
df2 <- data.frame(c3 = c("b", "c", "t", "u", "v", "w"),
c4 = sample(1:100, 6))
# 1. 左连接(保留左表所有行)
df1 %>% left_join(df2, by = c("c2" = "c3"))
# by: 指定连接键(左表列=右表列)
# 2. 右连接(保留右表所有行)
df1 %>% right_join(df2, by = "c2")
# 3. 内连接(仅保留匹配行)
df1 %>% inner_join(df2, by = "c2")
# 4. 全连接(保留所有行,缺失值填NA)
df1 %>% full_join(df2, by = "c2")
2. 列合并与行合并
# 列合并(按行对齐,需行数相同)
cbind(df1, df2)
# 行合并(按列对齐,需列名相同)
rbind(df1, df1)
四、数据重塑:列拆分、合并与长宽转换
1. 列拆分与合并:tidyr
包
install.packages("tidyr")
library(tidyr)
# 示例数据框
df1 <- data.frame(
c1 = c("a-1", "b-2", "c-3"),
c2 = c("d.4", "e.5", "f.6")
)
# 1. 列拆分(separate)
df2 <- df1 %>%
separate(col = c1, sep = "-", into = c("char", "num")) %>% # 按-拆分
separate(col = c2, sep = "\\.", into = c("letter", "number")) # 按.拆分
# 2. 列合并(unite)
df2 %>%
unite(col = "combined", char, letter, sep = "_") %>% # 合并为combined列
unite(col = "all", num, number, sep = "") # 合并为all列(无分隔符)
2. 长宽数据转换:pivot_longer
与pivot_wider
# 示例宽数据
df_wide <- data.frame(
id = 1:2,
week1 = c(80, 90),
week2 = c(85, 95)
)
# 宽转长(收集列)
df_long <- df_wide %>%
pivot_longer(cols = -id, # 排除id列
names_to = "week", # 列名转为week列
values_to = "score") # 数值转为score列
# 长转宽(展开列)
df_long %>%
pivot_wider(names_from = week, # week值作为列名
values_from = score) # score值填充列
五、冲突管理与包依赖
1. 函数冲突解决:conflicted
包
install.packages("conflicted")
library(conflicted)
# 解决dplyr与stats的filter冲突
conflict_prefer("filter", "dplyr")
2. 常用包依赖关系
功能 | 核心包 | 主要函数 / 用途 |
---|---|---|
数据导入 | base/tidyverse | read.table/fread/read_excel |
数据清洗 | dplyr | filter/select/mutate/group_by |
数据重塑 | tidyr | separate/unite/pivot_longer/pivot_wider |
数据合并 | dplyr | left_join/inner_join 等 |
管道操作 | magrittr | %>% |
冲突管理 | conflicted | conflict_prefer |
六、实战建议
- 数据导入最佳实践:
- 大文件优先用
data.table::fread
- 多文件批量处理用
list.files
+lapply
- 大文件优先用
- 管道操作原则:每个管道步骤只做一件事(筛选→分组→汇总)
- 长宽转换场景:
- 宽转长:用于机器学习输入(特征列统一)
- 长转宽:用于报表展示(指标横向对比)
通过掌握这些数据整理技巧,可大幅提升 R 语言数据处理效率,为后续分析建模奠定坚实基础!