用dplyr进行R子集化

时间:2016-12-06 13:29:55

标签: r dataset dplyr subset tidy

使用R子集和排列数据集进行故障排除。 我有一个如下所示的数据集:

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    

请注意,每个技能数据集的列数可能会有所不同,具体取决于每个学生的观察数量。另请注意,如果数据集中没有这样的观察值,则该值可以是NA(学生可以尝试与其他学生不同的技能次数)。

我认为这可能是dplyr包的一项工作,但我不确定。

我非常感谢社区的帮助!!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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