2016-12-06 8 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

を見るためには、それは常に想定していますか? –

答えて

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.tabledata.tableSkill列によってセグメント化することができ

res 
# Skill   V1 
# 1: 10 <data.table> 
# 2: 15 <data.table> 

res[Skill == 10, V1] 
# [[1]] 
# Student 1 2 3 
# 1: 64525 1 1 NA 
# 2: 70363 0 1 1 
NAは最後に埋められること

または列全体

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

関連する問題