2016-12-06 9 views
0

R로 문제를 일으키고 데이터 세트를 서브 세트하고 정렬합니다. I는 다음과 같습니다 데이터 집합이 : 나는 각 학생에 대한 행과 각 관측에 대한 열 (수정)과, 각 기술에 대한 새로운 데이터 집합을 만들어야합니다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.table S data.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