R子集与dplyr
问题描述:
与R子集并排列数据集的问题。 我有一个数据集,看起来像这样:R子集与dplyr
Student Skill Correct
64525 10 1
64525 10 1
70363 10 0
70363 10 1
70363 10 1
64525 15 0
70363 15 0
70363 15 1
我需要为每个技能新的数据集,用一排为每个学生和每个观测列(正确的)。就像这样:
Skill: 10
Student Obs1 Obs2 Obs3
64525 1 1 NA
70363 0 1 1
Skill: 15
Student Obs1 Obs2
64525 0 NA
70363 0 1
注意,每个技能集的列数可以不同,这取决于每个学生的观测numebr。还要注意,如果数据集中没有这样的观察值(学生可以尝试该技能的次数比其他学生不同),则该值可以是NA。
我认为这可能是一个dplyr包的工作,但我不确定。
我真的很感谢社区的帮助!
答
这将完成工作。
xy <- read.table(text = "Student Skill Correct
64525 10 1
64525 10 1
70363 10 0
70363 10 1
70363 10 1
64525 15 0
70363 15 0
70363 15 1", header = TRUE)
# first split by skill and work on each element
sapply(split(xy, xy$Skill), FUN = function(x) {
# extract column correct
out <- sapply(split(x, x$Student), FUN = "[[", "Correct")
# pad shortest vectors with NAs at the end
out <- mapply(out, max(lengths(out)), FUN = function(m, a) {
c(m, rep(NA, times = (a - length(m))))
}, SIMPLIFY = FALSE)
do.call(rbind, out)
})
$`10`
[,1] [,2] [,3]
64525 1 1 NA
70363 0 1 1
$`15`
[,1] [,2]
64525 0 NA
70363 0 1
答
这里是一个可能的data.table
实现
library(data.table) # V 1.10.0
res <- setDT(df)[, .(.(dcast(.SD, Student ~ rowid(Student)))), by = Skill]
这将导致在data.table
s的data.table
res
# Skill V1
# 1: 10 <data.table>
# 2: 15 <data.table>
可能受Skill
列被分割
res[Skill == 10, V1]
# [[1]]
# Student 1 2 3
# 1: 64525 1 1 NA
# 2: 70363 0 1 1
或者为了看到整列
res[, V1]
# [[1]]
# Student 1 2 3
# 1: 64525 1 1 NA
# 2: 70363 0 1 1
#
# [[2]]
# Student 1 2
# 1: 64525 0 NA
# 2: 70363 0 1
+0
在data.table中很好地使用'dcast'。 – akrun
是否总是假定NA的末补齐? –