创建多个向量,以便用户对单独的问题做出单独的回答

时间:2015-05-22 22:12:01

标签: r

我有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)我被告知要尽量避免循环如果可能的话,但我不确定在这种情况下如何。如果它有所帮助,我很高兴提供我尝试过的(使用循环),但我认为它有太多错误,因为它值得发布。任何帮助都会非常感激!

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将包含输出向量。