2016-12-06 84 views
0

與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的末補齊? –

回答

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 
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