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包的工作,但我不确定。

我真的很感谢社区的帮助!

+0

是否总是假定NA的末补齐? –

这将完成工作。

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