0

如何将数据 X 转换为 Y,如

X = data.frame(
  ID = c(1,1,1,2,2),
  NAME = c("MIKE","MIKE","MIKE","LUCY","LUCY"),
  SEX = c("MALE","MALE","MALE","FEMALE","FEMALE"),
  TEST = c(1,2,3,1,2),
  SCORE = c(70,80,90,65,75)
)

Y = data.frame(
  ID = c(1,2),
  NAME = c("MIKE","LUCY"),
  SEX = c("MALE","FEMALE"),
  TEST_1 =c(70,65),
  TEST_2 =c(80,75),
  TEST_3 =c(90,NA)
)

中的dcast函数reshape2似乎可以工作,但它不能在数据中包含其他列,如上面示例中的 ID、NAME 和 SEX。

假设一个 ID 列的所有其他列都是一致的,比如 Mike 只能是 ID 为 1 的男性,我们该怎么做呢?

4

1 回答 1

1

根据文档 ( ?reshape2::dcast),在公式中dcast()允许:...

“...”表示公式中未使用的所有其他变量...

对于reshape2data.table都支持的软件包都是如此dcast()

所以,你可以写:

reshape2::dcast(X, ... ~ TEST, value.var = "SCORE")
#  ID NAME    SEX  1  2  3
#1  1 MIKE   MALE 70 80 90
#2  2 LUCY FEMALE 65 75 NA

但是,如果 OP 坚持列名应该是TEST_1,TEST_2等,则TEST需要在重塑之前修改列。在这里,data.table使用:

library(data.table)
dcast(setDT(X)[, TEST := paste0("TEST_", TEST)], ... ~ TEST, value.var = "SCORE")
#   ID NAME    SEX TEST_1 TEST_2 TEST_3
#1:  1 MIKE   MALE     70     80     90
#2:  2 LUCY FEMALE     65     75     NA

这与 data.frame 给出的预期答案一致Y

于 2017-04-13T15:46:33.187 回答