Разделить столбец конкатенированных данных с разделителями-запятыми и вывести их в качестве коэффициентов

Я пытаюсь очистить некоторые данные, которые были неправильно введены. Вопрос о переменной допускает множественные ответы из пяти вариантов, пронумерованных как от 1 до 5. Данные были введены следующим образом (это всего лишь пример – есть много других переменных и много других наблюдений в реальных данных Рамка):

data V1 1 1, 2, 3 2 1, 2, 4 3 2, 3, 4, 5 4 1, 3, 4 5 1, 3, 5 6 2, 3, 4, 5 

Вот код для воссоздания данных примера:

 data = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", "1, 3, 4", "1, 3, 5", "2, 3, 4, 5")) 

Мне действительно нужны данные, которые нужно обрабатывать больше … binary – как набор вопросов «да / нет» – введен в кадр данных, который больше похож:

 data V1.1 V1.2 V1.3 V1.4 V1.5 1 1 1 1 NA NA 2 1 1 NA 1 NA 3 NA 1 1 1 1 4 1 NA 1 1 NA 5 1 NA 1 NA 1 6 NA 1 1 1 1 

Фактические имена переменных не имеют значения на данный момент – я могу легко исправить это. Кроме того, не имеет большого значения, являются ли недостающие элементы «O», «NA» или «blank» – это то, что я могу исправить позже.

Я пробовал использовать функцию transform из пакета strsplit , а также загружал разные вещи с помощью strsplit , но я не могу заставить себя делать то, что я ищу. Я также рассмотрел многие другие связанные вопросы о Stackoverflow, но они, похоже, не совсем такие же проблемы.

Вам просто нужно написать функцию и apply . Сначала некоторые фиктивные данные:

 ##Make sure you're not using factors dd = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"), stringsAsFactors=FALSE) 

Затем создайте функцию, которая принимает строку и при необходимости преобразуется

 make_row = function(i, ncol=5) { ##Could make the default NA if needed m = numeric(ncol) v = as.numeric(strsplit(i, ",")[[1]]) m[v] = 1 return(m) } 

Затем используйте apply и перенести результат

 t(apply(dd, 1, make_row)) 

Спустя долгое время я, наконец, начал создавать пакет ( «splitstackshape» ), который эффективно обрабатывает данные такого рода. Итак, для удобства других (и, конечно же, саморекламы) это компактное решение.

Соответствующей функцией для этой проблемы является cSplit_e .

Во-первых, настройки по умолчанию, которые сохраняют исходный столбец и используют NA как заполнение:

 library(splitstackshape) cSplit_e(data, "V1") # V1 V1_1 V1_2 V1_3 V1_4 V1_5 # 1 1, 2, 3 1 1 1 NA NA # 2 1, 2, 4 1 1 NA 1 NA # 3 2, 3, 4, 5 NA 1 1 1 1 # 4 1, 3, 4 1 NA 1 1 NA # 5 1, 3, 5 1 NA 1 NA 1 # 6 2, 3, 4, 5 NA 1 1 1 1 

Во-вторых, с отбрасыванием исходного столбца и использованием 0 в качестве заливки.

 cSplit_e(data, "V1", drop = TRUE, fill = 0) # V1_1 V1_2 V1_3 V1_4 V1_5 # 1 1 1 1 0 0 # 2 1 1 0 1 0 # 3 0 1 1 1 1 # 4 1 0 1 1 0 # 5 1 0 1 0 1 # 6 0 1 1 1 1 
Давайте будем гением компьютера.