将长格式 R 数据切成多列

Slicing long form R data into multiple columns

我得到了一些数据,我已将它们组合成长格式,但我需要将其转换为特定格式才能交付。我修改了数据框和列表选项,但似乎无法找到一种方法将我拥有的数据放入我需要的输出表单中。任何想法和解决方案表示赞赏。

如果 R 所需的输出形式看起来很奇怪,那是因为其他人会在 Excel 中打开结果数据进行进一步研究。所以我会将最终数据保存为csv或Excel文件。所需形式的完整数据将有 40 行 (+header) 和 110 列(55 个学生和分数对)。

这是我的长格式数据的示例代码:

class student score
1 a 0.4977
1 b 0.7176
1 c 0.9919
1 d 0.3800
1 e 0.7774
2 f 0.9347
2 g 0.2121
2 h 0.6517
2 i 0.1256
2 j 0.2672
3 k 0.3861
3 l 0.0134
3 m 0.3824
3 n 0.8697
3 o 0.3403

这是我需要如何显示最终数据的示例:

class_1_student class_1_score class_2_student class_2_score class_3_student class_3_score
a 0.4977 f 0.9347 k 0.3861
b 0.7176 g 0.2121 l 0.0134
c 0.9919 h 0.6517 m 0.3824
d 0.3800 i 0.1256 n 0.8697
e 0.7774 j 0.2672 o 0.3403

这是生成示例长表单和所需表单数据的 R 代码:

set.seed(1)
d <- data.frame(
  class=c(rep(1,5), rep(2,5), rep(3,5)),
  student=c(letters[1:5], letters[6:10], letters[11:15]),
  score=round(runif(15, 0, 1),4)
)
d2 <- data.frame(
  class_1_student = d[1:5,2],
  class_1_score = d[1:5,3],
  class_2_student = d[6:10,2],
  class_2_score = d[6:10,3],
  class_3_student = d[11:15,2],
  class_3_score = d[11:15,3]
)

如果有帮助,我还将学生和分数数据放在单独的矩阵中(每个学生 1 行,每个 class 1 列),我可以用它来帮助生成最终数据。

您可以拆分数据:

library(tidyverse)

split(select(d, -class), d$class) %>% 
  imap(~setNames(.x, str_c("class", .y, names(.x), sep = "_"))) %>%
  bind_cols()

仅当组大小相等时,列绑定才有效。