【发布时间】:2018-09-19 01:41:48
【问题描述】:
我有以下数据框 (df),其中对于每个参与者,“成绩”列是通过粘贴某些项目的分数来构建的。例如,参与者“1”在一个项目“a”上获得了 4,在项目“b”上获得了 7,在项目“c”上获得了 8。 (请注意,等级是一个字符)。另请注意,参与者“2”只有两个分数(假设这是与参与者“1”不同的考试)。
df = data.frame(participants = c(1, 1, 2),
variables = c('abc', 'ef', 'abc'),
grades= c('478', '58', '942'),
stringsAsFactors = FALSE)
participants variables grades
1 1 abc 478
2 1 ef 58
3 2 abc 942
(我的数据包含 100,000 行,如上。)
我想把数据转换成整洁的样式,如下:
participants variables grades
1 1 a 4
2 1 b 7
3 1 c 8
4 1 e 5
5 1 f 8
6 2 a 9
7 2 b 4
8 2 c 2
我做了什么
variables = lapply(X=1:length(df$variables), FUN=function(X) {
strsplit(df$variables[X], "") %>% .[[1]]}) %>% reduce(c)
grades = lapply(X=1:length(df$grades), FUN=function(X) {
strsplit(df$grades[X], "") %>% .[[1]]}) %>% reduce(c)
participants = lapply(X=1:length(df$participants), FUN=function(X) {
rep(df$participants[X], nchar(df$variables[X])) })%>% reduce(c)
data.frame(participants, variables, grades)
然而,在我的机器上处理我的真实数据需要几分钟,我觉得它真的效率不高,因为我需要 3 个不同的调用。
欢迎任何关于获取整洁数据的有效方法的想法(我与 tidyr/dplyr 合作)
【问题讨论】:
标签: r list dataframe dplyr tidyr