2017-01-13 6 views
3

Я работаю с данными опроса, пытаясь получить несколько ответов в одном столбце. Проблема в том, что может быть 1-5 ответов, разделенных запятыми.Как разделить с неравным столбцом (reverse toString) в dplyr

Как превратить это:

df <- data.frame(
    splitThis = c("A,B,C","B,C","A,C","A","B","C") 
) 

> df 
    splitThis 
1  A,B,C 
2  B,C 
3  A,C 
4   A 
5   B 
6   C 

в этом:

intoThis <- data.frame(
    A = c(1,0,1,1,0,0), 
    B = c(1,1,0,0,1,0), 
    c = c(1,1,1,0,0,1) 
) 

> intoThis 
    A B c 
1 1 1 1 
2 0 1 1 
3 1 0 1 
4 1 0 0 
5 0 1 0 
6 0 0 1 

Любые споры оцененная помощь!

ответ

4

Мы можем использовать mtabulate из qdapTools после расщепления по ,

library(qdapTools) 
mtabulate(strsplit(as.character(df$splitThis), ",")) 
# A B C 
#1 1 1 1 
#2 0 1 1 
#3 1 0 1 
#4 1 0 0 
#5 0 1 0 
#6 0 0 1 

В ОП также отметил dplyr/tidyr

library(dplyr) 
library(tidyr) 
library(tibble) 
rownames_to_column(df, "rn") %>% 
      separate_rows(splitThis) %>% 
      table() 

Или с помощью tidyverse пакетов

rownames_to_column(df, "rn") %>% 
     separate_rows(splitThis) %>% 
     group_by(rn, splitThis) %>% 
     tally %>% 
     spread(splitThis, n, fill=0) %>% 
     ungroup() %>% 
     select(-rn) 
# A tibble: 6 × 3 
#  A  B  C 
#* <dbl> <dbl> <dbl> 
#1  1  1  1 
#2  0  1  1 
#3  1  0  1 
#4  1  0  0 
#5  0  1  0 
#6  0  0  1 
+0

Вы гений и ученый. Позвольте мне реализовать это и посмотреть, работает ли оно с моими данными. По какой-то причине я думал, что 'tibble' был пакетом« Hadleyverse ». – Zafar

+1

@ Дана Да, это и есть. В предыдущем я получил результаты с 'table', который находится в' base R', поэтому я решил использовать 'spread' и т. Д. Спасибо за щедрые комментарии. Я считаю себя обучающимся каждый день из вопросов от вас, ребята, и от отличных ответов от других. – akrun

+0

Да, отлично поработал с моими данными опроса, спасибо! – Zafar