двойной спред без жесткого кодирования - PullRequest
0 голосов
/ 03 июля 2018

Я застрял здесь. Я пытался использовать spread дважды из tidyr, я пытался присоединиться. Но ни один из этих методов не дает правильного решения без некоторого жесткого кодирования.

Есть ли способ преобразовать эти данные:

    cat1   cat2 title
1      A      G    AB
2      B      G    BC
3      C      B    CD
4      D      G    DE
5      E      H    EF
6      F      A    FG

в это:

   A B C D E F G H
AB 1 0 0 0 0 0 1 0
BC 0 1 0 0 0 0 1 0
CD 0 1 1 0 0 0 0 0
DE 0 0 0 1 0 0 1 0
EF 0 0 0 0 1 0 0 1
FG 1 0 0 0 0 1 0 0

Пример данных:

df<-data.frame(cat1=LETTERS[1:6],
               cat2=c('G','G','B','G','H','A'),
               title=paste0(LETTERS[1:6],LETTERS[2:7]))

Поскольку я обычно получаю dplyr ответов быстрее: Base R или tidyr также приветствуются только решения

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я не знаю, квалифицируется ли это как несложное кодирование для операции

df %>% 
  tidyr::gather(key = vars, value = values, cat1, cat2) %>% 
  dplyr::mutate(vars = 1) %>% 
  tidyr::spread(key = values, value = vars, fill = 0)
#   title A B C D E F G H
# 1    AB 1 0 0 0 0 0 1 0
# 2    BC 0 1 0 0 0 0 1 0
# 3    CD 0 1 1 0 0 0 0 0
# 4    DE 0 0 0 1 0 0 1 0
# 5    EF 0 0 0 0 1 0 0 1
# 6    FG 1 0 0 0 0 1 0 0
0 голосов
/ 03 июля 2018

Сначала melt, затем приведение:

require(reshape2)

melt(df, id="title") %>% dcast(title ~ value, length)

  title A B C D E F G H
1    AB 1 0 0 0 0 0 1 0
2    BC 0 1 0 0 0 0 1 0
3    CD 0 1 1 0 0 0 0 0
4    DE 0 0 0 1 0 0 1 0
5    EF 0 0 0 0 1 0 0 1
6    FG 1 0 0 0 0 1 0 0

melt помещает все значения в один столбец для приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...