📜  R-数据重塑(1)

📅  最后修改于: 2023-12-03 15:34:36.288000             🧑  作者: Mango

R数据重塑

在数据分析和数据科学中,数据往往需要被转换成某种格式、某种形式以便进行分析和处理。R提供了许多数据重塑的函数和技术,本文将介绍R中几种经典的数据重塑方法。

1. 长宽数据转换

当数据集的每个变量不只包含单个值时,数据集就被称为“宽”数据集。相反,当一个数据集中每个变量只包含一个值时,数据集就被称为“长”数据集。在R中,reshape2tidyr包提供了几个函数将数据集从“宽”转换为“长”,或从“长”转换为“宽”。

1.1 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
1.2 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
2. 数据堆叠和展开

除了reshape2tidyr包中提供的函数外,R还提供了一些便于数据堆叠和展开的函数。这些函数包括rbind()cbind()stack()unstack()

2.1 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
2.2 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
2.3 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
2.4 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
3. 总结

本文介绍了R中几个经典的数据重塑方法,包括“宽”数据集和“长”数据集的转换、数据堆叠和展开。这些方法可以帮助数据科学家和数据分析师更好地理解和处理数据。