Более быстрый способ создания двоичного вектора фиксированной длины: если фиксированная длина, скажем, 6, 4 'станет (0,0,0,1,0,0) - PullRequest
1 голос
/ 08 октября 2019

У меня есть огромные данные ответов на вопросы с несколькими вариантами ответов. Каждый ряд представляет ответ человека на около 73 вопросов. Каждый столбец представляет ответ на вопрос: например, если они ответили (d), они получают 4. Я хочу превратить каждое наблюдение (строку, столбец) в вектор 1 и 0, поэтому (d) станет (0,0), 0,1).

Я создал 2 логических цикла. Но это занимает много времени.

Кто-нибудь знает более быстрый / умный / более эффективный способ сделать это?

enter image description here

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Я использую простые примеры данных:

df <- data.frame(answers = c(1,2,5,4,3,2,6,1,4))

  answers
1       1
2       2
3       5
4       4
5       3
6       2
7       6
8       1
9       4

Затем создайте пустые векторы

df$recode <- list(rep(0, 6))

  answers           recode
1       1 0, 0, 0, 0, 0, 0
2       2 0, 0, 0, 0, 0, 0
3       5 0, 0, 0, 0, 0, 0
4       4 0, 0, 0, 0, 0, 0
5       3 0, 0, 0, 0, 0, 0
6       2 0, 0, 0, 0, 0, 0
7       6 0, 0, 0, 0, 0, 0
8       1 0, 0, 0, 0, 0, 0
9       4 0, 0, 0, 0, 0, 0

Затем манипулируйте ими в соответствии с информацией в ваших ответах.

df$recode <- Map(function(x,y) `[<-`(x,y,1), x = df$recode, y = df$answers)

  answers           recode
1       1 1, 0, 0, 0, 0, 0
2       2 0, 1, 0, 0, 0, 0
3       5 0, 0, 0, 0, 1, 0
4       4 0, 0, 0, 1, 0, 0
5       3 0, 0, 1, 0, 0, 0
6       2 0, 1, 0, 0, 0, 0
7       6 0, 0, 0, 0, 0, 1
8       1 1, 0, 0, 0, 0, 0
9       4 0, 0, 0, 1, 0, 0
0 голосов
/ 08 октября 2019

to_dummy из пакета sjmisc может сделать эту работу.

library(sjmisc)
df1=data.frame(Q1=c(1,2,3,4),Q2=c(2,2,3,4))
to_dummy(df1)

Как вы можете видеть, он создает только 3 переменные для Q2, что является неудовлетворительным (он имеет только 3 модальности). Так что это будет работать только в том случае, если для каждого вопроса будут присутствовать все модальности.

Быстрый взлом состоит в добавлении четырех строк в ваши данные (один по модальности) и последующем их удалении.

df2=rbind(df1,rep(1,ncol(df1)),rep(2,ncol(df1)),rep(3,ncol(df1)),rep(4,ncol(df1)))

to_dummy(df2)[1:(nrow(df2)-4),]
...