将重复的问题折叠成 R 中的总结列

Collapse repeated questions into summative columns in R

我有一个使用 Qualtrics 的循环和合并功能创建的数据集,这意味着每个受访者都回答了相同 10 个问题的 25 个版本中的 1 个。下面的代码为 3 个参与者生成结果数据。总共有 25 位参与者和 250 个列与这些问题相关,但每个人只回答了其中的 10 个。还有一个身份证号码栏。

structure(list(id = 1:3, q1..1 = c(2L, NA, NA), q2..1 = c(4L, 
NA, NA), q3..1 = c(3L, NA, NA), q4..1 = c(5L, NA, NA), q5..1 = c(2L, 
NA, NA), q6..1 = c(1L, NA, NA), q7..1 = c(2L, NA, NA), q8..1 = c(4L, 
NA, NA), q9..1 = c(6L, NA, NA), q10..1 = c(3L, NA, NA), q1..2 = c(NA, 
3L, NA), q2..2 = c(NA, 5L, NA), q3..2 = c(NA, 2L, NA), q4..2 = c(NA, 
6L, NA), q5..2 = c(NA, 4L, NA), q6..2 = c(NA, 2L, NA), q7..2 = c(NA, 
3L, NA), q8..2 = c(NA, 4L, NA), q9..2 = c(NA, 2L, NA), q10..2 = c(NA, 
1L, NA), q1..3 = c(NA, NA, 1L), q2..3 = c(NA, NA, 3L), q3..3 = c(NA, 
NA, 4L), q4..3 = c(NA, NA, 2L), q5..3 = c(NA, NA, 4L), q6..3 = c(NA, 
NA, 5L), q7..3 = c(NA, NA, 3L), q8..3 = c(NA, NA, 3L), q9..3 = c(NA, 
NA, 2L), q10..3 = c(NA, NA, 2L)), class = "data.frame", row.names = c(NA, 
-3L))

我正在尝试将所有人的回复折叠成 10 列,方法是创建 10 个新列并用人们的回复填充它们,或者只是将每个人的 10 个回复一直移动到数据集的左侧,然后删除剩余的列。所以我试图得到类似这样的结果:

structure(list(id = 1:3, q1 = c(2L, 3L, 1L), q2 = c(4L, 5L, 3L
), q3 = c(3L, 2L, 4L), q4 = c(5L, 6L, 2L), q5 = c(2L, 4L, 4L), 
    q6 = c(1L, 2L, 5L), q7 = c(2L, 3L, 3L), q8 = c(4L, 4L, 3L
    ), q9 = c(6L, 2L, 2L), q10 = c(3L, 1L, 2L)), class = "data.frame", row.names = c(NA, 
-3L))

我什至没有成功,所以我没有任何有用的准备工作 post。在此先感谢您的帮助!

我们可以使用split.default根据列名的公共部分来划分数据。假设每个问题只有一个答案,我们可以忽略 NA 值进行逐行求和。

temp <- cbind(df[1], sapply(split.default(df[-1], 
         sub("\..*", "", names(df)[-1])), function(x) rowSums(x, na.rm = TRUE)))

temp[gtools::mixedsort(names(temp))]
#  id q1 q2 q3 q4 q5 q6 q7 q8 q9 q10
#1  1  2  4  3  5  2  1  2  4  6   3
#2  2  3  5  2  6  4  2  3  4  2   1
#3  3  1  3  4  2  4  5  3  3  2   2