我有1到20个多重响应问题的用户数据(即,对于用户实际完成的每个问题,他们可以检查多个响应,最多44个)。这是数据的一个子集(代表3个多重响应问题,每个问题有5个响应选项):
df <- structure(list(id = 1:5, q1.response1 = c(1L, NA, 1L, NA, 1L),
q1.response2 = c(NA, 1L, 1L, NA, NA), q1.response3 = c(NA,
1L, 1L, 1L, NA), q1.response4 = c(1L, 1L, 1L, NA, 1L), q1.response5 = c(NA,
1L, 1L, NA, NA), q2.response1 = c(NA, 1L, NA, NA, NA), q2.response2 = c(1L,
NA, 1L, 1L, 1L), q2.response3 = c(NA, 1L, NA, 1L, NA), q2.response4 = c(1L,
NA, NA, NA, 1L), q2.response5 = c(NA, 1L, NA, 1L, NA), q3.response1 = c(1L,
1L, NA, 1L, NA), q3.response2 = c(NA, 1L, NA, NA, NA), q3.response3 = c(1L,
NA, NA, 1L, NA), q3.response4 = c(1L, 1L, NA, NA, NA), q3.response5 = c(1L,
NA, NA, NA, NA)), .Names = c("id", "q1.response1", "q1.response2",
"q1.response3", "q1.response4", "q1.response5", "q2.response1",
"q2.response2", "q2.response3", "q2.response4", "q2.response5",
"q3.response1", "q3.response2", "q3.response3", "q3.response4",
"q3.response5"), class = "data.frame", row.names = c(NA, -5L))
A&#34; 1&#34;表示他们已经检查了该选项; NA表示他们没有。
我想要的是为每个问题创建一个向量,其中向量将只包含用户检出的响应的ID。因此,这里提供的样本数据应该产生13个向量(用户1,2,4给出了对所有3个问题的响应,因此3x3 = 9个向量,而用户3和5仅对问题1和2做出响应,因此2x2 = 4个向量),矢量(我想命名为user1q1,user1q2,user1q3,user2q1等)应如下所示:
> user1q1
[1] 1 4
# since in questions 1, user 1 only checked off response options 1 and 4, and the other 3 responses are NA
> user1q2
[1] 2 4
> user1q3
[1] 1 3 4 5
> user2q1
[1] 2 3 4 5
......等等。我尝试通过创建空向量并使用循环附加到它们来做到这一点,但(1)我无法使代码工作,(2)我被告知要尽量避免循环如果可能的话,但我不确定在这种情况下如何。如果它有所帮助,我很高兴提供我尝试过的(使用循环),但我认为它有太多错误,因为它值得发布。任何帮助都会非常感激!
答案 0 :(得分:1)
这也可能有所帮助:
library(stringr)
df1 <- df[,2:6]
df2 <- df[,7:11]
df3 <- df[,12:16]
dfs <- list(df1, df2, df3)
which.col <- function(v, target=1, opposite=FALSE) {
if (opposite == FALSE) {
index <- which(v==target)
} else {
index <- which(!v==target)
}
return(names(v)[index])
}
user <- function(userid, question) {
l <- which.col(dfs[[question]][userid,])
return(as.numeric(str_extract(l, ".$")))
}
user(1,1)
[1] 1 4
user(1,2)
[1] 2 4
user(1,3)
[1] 1 3 4 5
我把数据框分成3块。然后我创建了一个函数来查找满足值的向量的列名。然后我创建了一个名为user
的函数,它允许您输入一个id和问题来获得他们的答案的向量。
答案 1 :(得分:0)
这是您的示例案例的可能解决方案。您可以根据自己的要求进行自定义。
possibleResponses <- 5
numberOfQuestions <- 3
d2 <- apply(df, 1, function(userData) {
responseData <- matrix(userData[-1], nrow = numberOfQuestions, byrow = T)
structure(sapply(1:nrow(responseData), function(Qn) {
which(!is.na(responseData[Qn, ]))
}), names = paste0("user", userData[1], "q", 1:nrow(responseData)))
})
d3 <- do.call(c, d2)
d3
将包含输出向量。