我有一个使用Qualtrics的“循环和合并”功能创建的数据集,这意味着每个受访者都回答了相同的10个问题的25个版本中的1个。下面的代码为3个参与者生成结果数据。总共有25名参与者和与这些问题相关的250列,但每个人只回答了其中的10个。还有一个ID编号列。
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))
我什至没有成功,也没有任何成功,因此我没有任何有用的前期工作可发布。预先感谢您的帮助!
我们可以使用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