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

мне нужно будет создать новый набор данных для каждого навыка, со строкой для каждого студента и колонки для каждого наблюдения (Correct). Как это:

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

Всегда ли предположить, что NAs заполняются в конце? –

ответ

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 из 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 
+0

Хорошее использование 'dcast' внутри data.table. – akrun

Смежные вопросы