2016-12-06 6 views
0

Probleme mit R Subsetting und Anordnung von Datensätzen. Ich habe eine Datenmenge, die wie folgt aussieht:R Untergruppe mit 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 

ich brauchen würde, einen neuen Datensatz für jede Fähigkeit zu schaffen, mit einer Zeile für jeden Schüler und eine Spalte für jede Beobachtung (richtig). Wie folgt aus:

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  

Beachten Sie, dass die Anzahl der Spalten jeden Skill-Datensatz kann variieren, abhängig von der numebr von Beobachtungen für jeden Schüler. Beachten Sie auch, dass der Wert eine NA sein kann, wenn es im Datensatz keine solche Beobachtung gibt (ein Schüler kann die Fertigkeit eine andere Anzahl von Malen ausprobieren als andere Schüler).

Ich denke, das könnte ein Job für die dplyr-Paket, aber ich bin mir nicht sicher.

Ich schätze wirklich die Hilfe der Gemeinschaft !!

+0

Ist es immer davon ausgegangen, um zu sehen, dass NAs am Ende aufgefüllt werden? –

Antwort

0

Dies wird die Arbeit erledigen.

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

Hier ist eine mögliche Implementierung data.table

library(data.table) # V 1.10.0 
res <- setDT(df)[, .(.(dcast(.SD, Student ~ rowid(Student)))), by = Skill] 

, die in einem data.table von data.table s

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

führen wird, die durch die Skill Spalte segmentiert werden konnte

res[Skill == 10, V1] 
# [[1]] 
# Student 1 2 3 
# 1: 64525 1 1 NA 
# 2: 70363 0 1 1 

Oder, um die gesamte Spalte

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

Gute Verwendung von 'dcast' in data.table. – akrun