在数据分析和处理的过程中,数据整理是一项至关重要的任务。R 语言中的 tidyr 包提供了一组强大的函数,用于将数据转换为更易于分析的格式。tidyr 包的设计准则如下:
- 每个变量都有自己的列。
- 每个观察值都有自己的行。
- 每个值都有自己的单元格。
本文将详细介绍 tidyr 包中的主要函数及其用法,并提供相关的示例代码,帮助读者更好地理解和应用这些函数。
pivot_longer() – 宽表转长表
pivot_longer()
函数用于将宽格式的数据转换为长格式。在宽格式中,每个变量有多个列,而在长格式中,每个变量只有一列。这个转换有助于更好地进行数据分析和可视化。
语法
pivot_longer(data, cols, names_to = "name", values_to = "value")
示例
假设我们有一个包含学生考试成绩的宽格式数据框:
library(tidyr)
library(dplyr)
df <- tibble(
student = c("Alice", "Bob", "Charlie"),
math = c(85, 90, 78),
science = c(92, 85, 88)
)
我们可以使用 pivot_longer()
将其转换为长格式:
df_long <- df %>%
pivot_longer(cols = c(math, science), names_to = "subject", values_to = "score")
print(df_long)
输出结果:
# A tibble: 6 × 3
student subject score
<chr> <chr> <dbl>
1 Alice math 85
2 Alice science 92
3 Bob math 90
4 Bob science 85
5 Charlie math 78
6 Charlie science 88
pivot_wider() – 长表转宽表
pivot_wider()
函数用于将长格式的数据转换为宽格式。这在需要按变量进行分组或聚合时非常有用。
语法
pivot_wider(data, names_from, values_from)
示例
我们可以使用上面生成的长格式数据 df_long
将其转换回宽格式:
df_wide <- df_long %>%
pivot_wider(names_from = subject, values_from = score)
print(df_wide)
输出结果:
# A tibble: 3 × 3
student math science
<chr> <dbl> <dbl>
1 Alice 85 92
2 Bob 90 85
3 Charlie 78 88
separate() – 分列
separate()
函数用于将一列数据拆分为多列。通常用于含有分隔符的字符串列。
语法
separate(data, col, into, sep = " ")
示例
假设我们有一个包含完整姓名的数据框:
df_names <- tibble(
full_name = c("Alice Johnson", "Bob Smith", "Charlie Brown")
)
我们可以使用 separate()
将 full_name
列拆分为 first_name
和 last_name
:
df_separated <- df_names %>%
separate(full_name, into = c("first_name", "last_name"), sep = " ")
print(df_separated)
输出结果:
# A tibble: 3 × 2
first_name last_name
<chr> <chr>
1 Alice Johnson
2 Bob Smith
3 Charlie Brown
unite() – 合列
unite()
函数用于将多列数据合并为一列,通常用于需要生成一个复合键或组合字符串。
语法
unite(data, col, ..., sep = "_")
示例
我们可以使用 unite()
将 first_name
和 last_name
列合并为 full_name
:
df_united <- df_separated %>%
unite(full_name, first_name, last_name, sep = " ")
print(df_united)
输出结果:
# A tibble: 3 × 1
full_name
<chr>
1 Alice Johnson
2 Bob Smith
3 Charlie Brown
其他辅助函数
complete()
complete()
函数用于填补数据框中缺失的行,确保所有组合的变量都有对应的观察值。
示例
df_incomplete <- tibble(
student = c("Alice", "Bob", "Alice"),
subject = c("math", "math", "science"),
score = c(85, 90, 92)
)
df_complete <- df_incomplete %>%
complete(student, subject)
print(df_complete)
输出结果:
# A tibble: 4 × 3
student subject score
<chr> <chr> <dbl>
1 Alice math 85
2 Alice science 92
3 Bob math 90
4 Bob science NA
fill()
fill()
函数用于填充缺失值,通常用于时间序列数据或分组数据。
示例
df_missing <- tibble(
month = c(1, 2, 3, 4, 5),
value = c(10, NA, NA, 20, NA)
)
df_filled <- df_missing %>%
fill(value, .direction = "down")
print(df_filled)
输出结果:
# A tibble: 5 × 2
month value
<dbl> <dbl>
1 1 10
2 2 10
3 3 10
4 4 20
5 5 20
总结
tidyr 包提供了一套简洁而强大的工具,帮助我们将数据整理为分析友好的格式。通过掌握 pivot_longer()
、pivot_wider()
、separate()
和 unite()
等函数,以及 complete()
和 fill()
等辅助函数,我们可以有效地处理和转换数据。希望本文能帮助读者更好地理解和应用这些函数,提高数据处理的效率。