Вопрос по r – Разбить столбец объединенных данных, разделенных запятыми, и перекодировать вывод как факторы
Я пытаюсь очистить некоторые данные, которые были введены неправильно. Вопрос для переменной допускает множественные ответы из пяти вариантов, пронумерованных от 1 до 5. Данные были введены следующим образом (это только пример - в фактических данных есть еще много переменных и гораздо больше наблюдений) Рамка):
<code>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 </code>
Вот некоторый код для воссоздания данных этого примера:
<code>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")) </code>
Что мне действительно нужно, так это чтобы данные обрабатывались более ... двоично - как набор "да / нет" вопросы - вводятся во фрейм данных, который больше похож на:
<code>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 </code>
Фактические имена переменных на данный момент не имеют значения - я легко могу это исправить. Кроме того, не имеет большого значения, являются ли отсутствующие элементы "O", "NA" или пустыми - опять же, это то, что я могу исправить позже.
Я пытался использоватьtransform
функция отreshape
пакет, а также сытые разные вещи сstrsplit
, но я не могу заставить себя делать то, что я ищу.
Я также рассмотрел много других связанных вопросов по Stackoverflow, но они, похоже, не являются той же самой проблемой.
& Quot; splitstackshape & Quot;), который эффективно обрабатывает данные такого рода. Таким образом, для удобства других (и, конечно, для саморекламы) здесь представлено компактное решение.
Соответствующая функция для этой проблемы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
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))