5.6 长宽转换

args("reshape")
## function (data, varying = NULL, v.names = NULL, timevar = "time", 
##     idvar = "id", ids = 1L:NROW(data), times = seq_along(varying[[1L]]), 
##     drop = NULL, direction, new.row.names = NULL, sep = ".", 
##     split = if (sep == "") {
##         list(regexp = "[A-Za-z][0-9]", include = TRUE)
##     } else {
##         list(regexp = sep, include = FALSE, fixed = TRUE)
##     }) 
## NULL

PlantGrowth 数据集的重塑操作也可以使用内置的函数 reshape() 实现

PlantGrowth$id <- rep(1:10, 3)
reshape(
  data = PlantGrowth, idvar = "group", v.names = "weight",
  timevar = "id", direction = "wide",
  sep = ""
) %>% 
knitr::kable(.,
  caption = "不同生长环境下植物的干重", row.names = FALSE,
  col.names = gsub("(weight)", "", names(.)),
  align = "c"
)
表 5.1: 不同生长环境下植物的干重
group 1 2 3 4 5 6 7 8 9 10
ctrl 4.17 5.58 5.18 6.11 4.50 4.61 5.17 4.53 5.33 5.14
trt1 4.81 4.17 4.41 3.59 5.87 3.83 6.03 4.89 4.32 4.69
trt2 6.31 5.12 5.54 5.50 5.37 5.29 4.92 6.15 5.80 5.26

或者,我们也可以使用 tidyr 包提供的 pivot_wider() 函数

tidyr::pivot_wider(
  data = PlantGrowth, id_cols = id,
  names_from = group, values_from = weight
)

或者,我们还可以使用 data.table 包提供的 dcast() 函数,用于将长格式的数据框重塑为宽格式的

PlantGrowth_DT <- as.data.table(PlantGrowth)
# 纵
dcast(PlantGrowth_DT, id ~ group, value.var = "weight")
##     id ctrl trt1 trt2
##  1:  1 4.17 4.81 6.31
##  2:  2 5.58 4.17 5.12
##  3:  3 5.18 4.41 5.54
##  4:  4 6.11 3.59 5.50
##  5:  5 4.50 5.87 5.37
##  6:  6 4.61 3.83 5.29
##  7:  7 5.17 6.03 4.92
##  8:  8 4.53 4.89 6.15
##  9:  9 5.33 4.32 5.80
## 10: 10 5.14 4.69 5.26
# 横
dcast(PlantGrowth_DT, group ~ id, value.var = "weight")
##    group    1    2    3    4    5    6    7    8    9   10
## 1:  ctrl 4.17 5.58 5.18 6.11 4.50 4.61 5.17 4.53 5.33 5.14
## 2:  trt1 4.81 4.17 4.41 3.59 5.87 3.83 6.03 4.89 4.32 4.69
## 3:  trt2 6.31 5.12 5.54 5.50 5.37 5.29 4.92 6.15 5.80 5.26