Вопрос по r – Разбить столбец объединенных данных, разделенных запятыми, и перекодировать вывод как факторы

10

Я пытаюсь очистить некоторые данные, которые были введены неправильно. Вопрос для переменной допускает множественные ответы из пяти вариантов, пронумерованных от 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, но они, похоже, не являются той же самой проблемой.

Ваш Ответ

2   ответа
7

& 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
8

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))
Error: User Rate Limit ExceededncolError: User Rate Limit ExceededV1: max(as.numeric(unlist(strsplit(dd$V1, ", "))))Error: User Rate Limit Exceeded

Похожие вопросы