📅  最后修改于: 2023-12-03 15:34:36.288000             🧑  作者: Mango
在数据分析和数据科学中,数据往往需要被转换成某种格式、某种形式以便进行分析和处理。R提供了许多数据重塑的函数和技术,本文将介绍R中几种经典的数据重塑方法。
当数据集的每个变量不只包含单个值时,数据集就被称为“宽”数据集。相反,当一个数据集中每个变量只包含一个值时,数据集就被称为“长”数据集。在R中,reshape2
和tidyr
包提供了几个函数将数据集从“宽”转换为“长”,或从“长”转换为“宽”。
melt()
和dcast()
函数melt()
函数可以将“宽”数据集转变为“长”数据集,而dcast()
函数可以将“长”数据集转变为“宽”数据集。假设有以下数据:
# 宽数据集
df_wide <- data.frame(
id = 1:5,
gender = c("M", "F", "M", "F", "M"),
age = c(23, 21, 19, 20, 22),
score_math = c(80, 85, 90, 95, 92),
score_english = c(85, 80, 95, 90, 88)
)
# 查看数据
df_wide
输出结果:
id gender age score_math score_english
1 1 M 23 80 85
2 2 F 21 85 80
3 3 M 19 90 95
4 4 F 20 95 90
5 5 M 22 92 88
通过melt()
函数将数据转换为“长”数据集:
# 转换为长数据集
library(reshape2)
df_long <- melt(df_wide, id.vars = c("id", "gender", "age"))
# 查看数据
df_long
输出结果:
id gender age variable value
1 1 M 23 score_math 80
2 2 F 21 score_math 85
3 3 M 19 score_math 90
4 4 F 20 score_math 95
5 5 M 22 score_math 92
6 1 M 23 score_english 85
7 2 F 21 score_english 80
8 3 M 19 score_english 95
9 4 F 20 score_english 90
10 5 M 22 score_english 88
通过dcast()
函数将数据转换为“宽”数据集:
# 转换为宽数据集
df_wide <- dcast(df_long, id + gender + age ~ variable)
# 查看数据
df_wide
输出结果:
id gender age score_english score_math
1 1 M 23 85 80
2 2 F 21 80 85
3 3 M 19 95 90
4 4 F 20 90 95
5 5 M 22 88 92
gather()
和spread()
函数gather()
函数和spread()
函数是tidyr
包中的函数,可以和melt()
函数和dcast()
函数完成相同的功能。假设有以下数据:
# 宽数据集
df_wide <- data.frame(
id = 1:5,
gender = c("M", "F", "M", "F", "M"),
age = c(23, 21, 19, 20, 22),
score_math = c(80, 85, 90, 95, 92),
score_english = c(85, 80, 95, 90, 88)
)
# 查看数据
df_wide
输出结果:
id gender age score_math score_english
1 1 M 23 80 85
2 2 F 21 85 80
3 3 M 19 90 95
4 4 F 20 95 90
5 5 M 22 92 88
通过gather()
函数将数据转换为“长”数据集:
# 转换为长数据集
library(tidyr)
df_long <- gather(df_wide, key = "subject", value = "value", score_math, score_english)
# 查看数据
df_long
输出结果:
id gender age subject value
1 1 M 23 score_math 80
2 2 F 21 score_math 85
3 3 M 19 score_math 90
4 4 F 20 score_math 95
5 5 M 22 score_math 92
6 1 M 23 score_english 85
7 2 F 21 score_english 80
8 3 M 19 score_english 95
9 4 F 20 score_english 90
10 5 M 22 score_english 88
通过spread()
函数将数据转换为“宽”数据集:
# 转换为宽数据集
df_wide <- spread(df_long, key = "subject", value = "value")
# 查看数据
df_wide
输出结果:
id gender age score_english score_math
1 1 M 23 85 80
2 2 F 21 80 85
3 3 M 19 95 90
4 4 F 20 90 95
5 5 M 22 88 92
除了reshape2
和tidyr
包中提供的函数外,R还提供了一些便于数据堆叠和展开的函数。这些函数包括rbind()
、cbind()
、stack()
和unstack()
。
rbind()
函数rbind()
函数可以进行行堆叠,即将多个数据框按行合并成一个数据框。假设有以下数据:
df1 <- data.frame(
id = 1:3,
gender = c("M", "F", "M"),
age = c(23, 21, 19)
)
df2 <- data.frame(
id = 4:6,
gender = c("F", "M", "M"),
age = c(20, 22, 18)
)
通过rbind()
函数进行行堆叠:
# 行堆叠
df3 <- rbind(df1, df2)
# 查看数据
df3
输出结果:
id gender age
1 1 M 23
2 2 F 21
3 3 M 19
4 4 F 20
5 5 M 22
6 6 M 18
cbind()
函数cbind()
函数可以进行列堆叠,即将多个数据框按列合并成一个数据框。假设有以下数据:
df1 <- data.frame(
id = 1:3,
gender = c("M", "F", "M")
)
df2 <- data.frame(
age = c(23, 21, 19),
score_math = c(80, 85, 90),
score_english = c(85, 80, 95)
)
通过cbind()
函数进行列堆叠:
# 列堆叠
df3 <- cbind(df1, df2)
# 查看数据
df3
输出结果:
id gender age score_math score_english
1 1 M 23 80 85
2 2 F 21 85 80
3 3 M 19 90 95
stack()
函数stack()
函数可以将一个数据框中的多个列堆叠成两列,其中一列是值,另一列是该值所属的列名。假设有以下数据:
df <- data.frame(
id = 1:3,
gender = c("M", "F", "M"),
age = c(23, 21, 19),
score_math = c(80, 85, 90),
score_english = c(85, 80, 95)
)
使用stack()
函数堆叠数据:
# 堆叠数据
df_stack <- stack(df[, 4:5])
# 添加变量名列
df_stack$variable <- rep(c("score_math", "score_english"), each = nrow(df))
# 查看数据
df_stack
输出结果:
values ind variable
1 80 score_math
2 85 score_math
3 90 score_math
4 85 score_english
5 80 score_english
6 95 score_english
unstack()
函数unstack()
函数可以将两列分别堆叠成多列。假设有以下数据:
df <- data.frame(
values = c(80, 85, 90, 85, 80, 95),
variable = rep(c("score_math", "score_english"), each = 3)
)
使用unstack()
函数展开数据:
# 展开数据
df_unstacked <- unstack(df, values ~ variable)
# 查看数据
df_unstacked
输出结果:
score_english score_math
1 85 80
2 80 85
3 95 90
本文介绍了R中几个经典的数据重塑方法,包括“宽”数据集和“长”数据集的转换、数据堆叠和展开。这些方法可以帮助数据科学家和数据分析师更好地理解和处理数据。