Я немного потренировался с этим видом обработки данных, но вот несколько советов.
Сначала давайте предположим, что ваши данные имеют следующую форму:
dtf <- structure(list(Participant = c("1", "2", "3", "4"),
Physics = c("Y", "Y", "N", "N"), Chemistry = c("Y", "N", "N",
"N"), Math = c("N", "Y", "Y", "Y"), Biology = c("N", "Y", "N",
"Y")), class = "data.frame", row.names = c(NA, -4L))
Тогда мы можем изменить порядок вещей, как это
wh <- which(dtf == "Y", arr.ind=TRUE)
tapply(wh[,2], wh[,1], function(x) colnames(dtf)[x])
# $`1`
# [1] "Physics" "Chemistry"
# $`2`
# [1] "Physics" "Math" "Biology"
# $`3`
# [1] "Math"
# $`4`
# [1] "Math" "Biology"
Или
dtf2 <- dtf[1]
dtf2$Subject <- apply(dtf, 1, function(r) {c(names(dtf)[r == "Y"])})
dtf2
# Participant Subject
# 1 1 Physics, Chemistry
# 2 2 Physics, Math, Biology
# 3 3 Math
# 4 4 Math, Biology
Или используя melt()
и dcast()
из reshape2
library(reshape2)
dtf.m <- melt(dtf, 1)
dcast(dtf.m[dtf.m$value == "Y", 1:2], Participant ~ variable)
# Participant Physics Chemistry Math Biology
# 1 1 Physics Chemistry <NA> <NA>
# 2 2 Physics <NA> Math Biology
# 3 3 <NA> <NA> Math <NA>
# 4 4 <NA> <NA> Math Biology