将长格式 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()
仅当组大小相等时,列绑定才有效。
我得到了一些数据,我已将它们组合成长格式,但我需要将其转换为特定格式才能交付。我修改了数据框和列表选项,但似乎无法找到一种方法将我拥有的数据放入我需要的输出表单中。任何想法和解决方案表示赞赏。
如果 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()
仅当组大小相等时,列绑定才有效。