dplyr是R语言中一个非常强大的数据操作包,特别适用于数据清洗和数据转换。本文将总结dplyr包的主要函数及其用法,并给出相应的示例代码,帮助大家更好地掌握dplyr的使用。
一、单表部分
1. 对行的操作
- filter():根据条件筛选数据行。
- arrange() :对数据行进行排序。默认升序排列,若想设置为降序,可使用函数
desc()
。 - distinct():去除重复的行。
- slice() 系列函数:按行位置筛选。
示例代码:
r
library(dplyr)
# 创建示例数据框
df <- data.frame(
name = c("Alice", "Bob", "Carol", "Alice"),
score = c(85, 90, 78, 85)
)
# filter() 示例
df_filtered <- df %>% filter(score > 80)
# arrange() 示例
df_arranged <- df %>% arrange(score)
df_arranged_desc <- df %>% arrange(desc(score))
# distinct() 示例
df_distinct <- df %>% distinct()
# slice() 示例
df_sliced <- df %>% slice(1:2)
2. 对列的操作
- select():选择数据框中的列。
- mutate():添加或修改列。
- rename():重命名列。
- relocate():重新排列列的顺序。
- across() :对多列进行同样的操作,必须在data-masking verbs内使用。
示例代码:
r
# select() 示例
df_selected <- df %>% select(name)
# mutate() 示例
df_mutated <- df %>% mutate(passed = score > 80)
# rename() 示例
df_renamed <- df %>% rename(student_name = name)
# relocate() 示例
df_relocated <- df %>% relocate(score, .before = name)
# across() 示例
df_across <- df %>% mutate(across(score, ~ . / 10))
3. 分组统计
- group_by():对数据进行分组。
- summarise():对分组后的数据进行汇总。
- ungroup():取消分组。
- count():对某列进行计数。
- n():返回当前分组中的行数。
- rowwise():逐行操作。
示例代码:
r
# group_by() 和 summarise() 示例
df_grouped <- df %>% group_by(name) %>% summarise(avg_score = mean(score))
# ungroup() 示例
df_ungrouped <- df_grouped %>% ungroup()
# count() 示例
df_count <- df %>% count(name)
# rowwise() 示例
df_rowwise <- df %>% rowwise() %>% mutate(total_score = sum(score))
4. 其他常用函数
- if_else():条件判断。
- case_when():多条件判断。
- cumsum():计算累计和。
示例代码:
r
# if_else() 示例
df_if_else <- df %>% mutate(status = if_else(score > 80, "Pass", "Fail"))
# case_when() 示例
df_case_when <- df %>% mutate(
grade = case_when(
score >= 90 ~ "A",
score >= 80 ~ "B",
score >= 70 ~ "C",
TRUE ~ "D"
)
)
# cumsum() 示例
df_cumsum <- df %>% mutate(cumulative_score = cumsum(score))
二、多表部分
1. 内连接和外连接
- inner_join():内连接。
- left_join():左连接。
- right_join():右连接。
- full_join():全连接。
示例代码:
r
# 创建另一个示例数据框
df2 <- data.frame(
name = c("Alice", "Bob", "David"),
age = c(23, 25, 30)
)
# inner_join() 示例
df_inner_join <- df %>% inner_join(df2, by = "name")
# left_join() 示例
df_left_join <- df %>% left_join(df2, by = "name")
# right_join() 示例
df_right_join <- df %>% right_join(df2, by = "name")
# full_join() 示例
df_full_join <- df %>% full_join(df2, by = "name")
2. 半连接和反连接
- semi_join():半连接。
- anti_join():反连接。
示例代码:
r
# semi_join() 示例
df_semi_join <- df %>% semi_join(df2, by = "name")
# anti_join() 示例
df_anti_join <- df %>% anti_join(df2, by = "name")
3. 其他函数
- intersect():求交集。
- union():求并集。
- setdiff():求差集。
- bind_rows() 和 bind_cols():合并数据框。
示例代码:
r
# intersect() 示例 - 仅保留 'name' 列
df_common <- df["name"]
df2_common <- df2["name"]
df_intersect <- intersect(df_common, df2_common)
# union() 示例 - 仅保留 'name' 列
df_union <- union(df_common, df2_common)
# setdiff() 示例 - 仅保留 'name' 列
df_setdiff <- setdiff(df_common, df2_common)
# bind_rows() 示例 - 合并行
df_bind_rows <- bind_rows(df, df2)
# bind_cols() 示例 - 合并列(需要数据框行数相同)
# 为了演示,这里添加一些行以使 df2 行数与 df 相同
df2_expanded <- bind_rows(df2, data.frame(name = NA, age = NA))
bind_cols(df, df2_expanded)
通过上面的总结和示例代码,希望能帮助大家更好地理解和掌握dplyr包在R语言中的使用方法。dplyr提供了丰富的函数,能够极大地简化数据操作,提高工作效率。在实际工作中,我们应结合具体问题,灵活运用这些函数,解决数据处理中的各种需求。