使用R子集和排列数据集进行故障排除。 我有一个如下所示的数据集:
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
请注意,每个技能数据集的列数可能会有所不同,具体取决于每个学生的观察数量。另请注意,如果数据集中没有这样的观察值,则该值可以是NA(学生可以尝试与其他学生不同的技能次数)。
我认为这可能是dplyr包的一项工作,但我不确定。
我非常感谢社区的帮助!!
答案 0 :(得分:1)
这是一个可能的data.table
实现
library(data.table) # V 1.10.0
res <- setDT(df)[, .(.(dcast(.SD, Student ~ rowid(Student)))), by = Skill]
这会导致data.table
data.table
s
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
答案 1 :(得分:0)
这将完成工作。
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