Разбить длинную форму на строки, но с дубликатами, объединенными в виде строки, разделенной символом «;»?

#r #dplyr #reshape2

#r #dplyr #изменение формы 2

Вопрос:

Предположим, у меня есть фрейм данных, который я хочу разбить на строки.

 temp = data.frame ( group=c('a','b','c'), fruits = c('apple', 'orange', 'none'), days=c('mon','tues','wed') )
reshape2::dcast(temp , days ~ group, value.var=c ( "fruits") )
  days     a      b    c
1  mon apple   <NA> <NA>
2 tues  <NA> orange <NA>
3  wed  <NA>   <NA> none
  

Это работает нормально, однако, когда я добавляю дублированную строку как таковую.

 temp = rbind ( temp, c('a','orange','mon')  )
  

приведение не удалось бы и отображалось бы только общее количество. Чего я действительно хочу, так это чего-то подобного.

  days     a      b    c
1  mon apple;orange   <NA> <NA>
2 tues  <NA> orange <NA>
3  wed  <NA>   <NA> none
  

Спасибо!

Ответ №1:

Попробуйте это tidyverse решение. Вы можете объединить свои данные с помощью paste0() , чтобы получить правильную структуру для преобразования в широкий формат:

 library(tidyverse)
#Code
temp %>%
  group_by(group,days) %>%
  summarise(fruits=paste0(fruits,collapse = ';')) %>%
  pivot_wider(names_from = group,values_from=fruits)
  

Вывод:

 # A tibble: 3 x 4
  days  a            b      c    
  <chr> <chr>        <chr>  <chr>
1 mon   apple;orange NA     NA   
2 tues  NA           orange NA   
3 wed   NA           NA     none 
  

Комментарии:

1. прекрасное спасибо вам! Я также использовал двухэтапные решения, сначала сворачивая пастой, но ваше решение намного чище.