Свернуть повторяющиеся вопросы в итоговые столбцы в R - PullRequest
0 голосов
/ 12 марта 2020

У меня есть набор данных, созданный с использованием функции L oop и слияния Qualtrics, что означает, что каждый респондент ответил на 1 из 25 версий тех же 10 вопросов. Приведенный ниже код создает итоговые данные для 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))

У меня нет никакого успеха, даже когда я начинаю это, поэтому у меня нет никакой предварительной предварительной работы для публикации. Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 12 марта 2020

Мы можем использовать 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
...