Как использовать R для преобразования нескольких строк в отдельные столбцы — от длинных к широким?

#r

#r

Вопрос:

У меня есть следующий df,

 ID  event   eventdate1     date2       date3        date4     date5  index1   index2   index3
1   before               1/22/2020  
1   now                              10/20/2017   10/25/2017
1   later   03/02/2020                                                  0         1        0
1   tomo    05/05/2020                                                  0         0        0
 

Я хотел бы изменить это на wide, и ожидаемый результат будет,

 ID    date2     eventdate1      date3      date4       date5   index1   index2   index3
1   1/22/2020   05/05/2020   10/20/2017   10/25/2017             0         0        0
 

eventdate1 связан с событием.

eventdate1 всегда будет печатать последнюю дату, то есть для tomo.

То же самое для index1, index2 и index3. Все остальные даты будут иметь только одну дату в столбце.

date5 пуст, и я надеюсь сохранить его пустым

Я надеюсь использовать reshape, но любой другой метод тоже будет работать.

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

1. Его R…@DaniMesejo

2. столбец date2 присутствует в ожидаемом выводе. Многие строки являются пустыми строками и намерены сохранить их пустыми во время изменения формы

Ответ №1:

С dplyr вами можно попробовать :

 library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(across(eventdate1:index3, ~{
                  x <- .[.!='']
                  if(length(x)) last(x) else ''
                  })) -> result

result

#     ID eventdate1 date2     date3      date4      date5 index1 index2 index3
#  <int> <chr>      <chr>     <chr>      <chr>      <chr> <chr>  <chr>  <chr> 
#1     1 05/05/2020 1/22/2020 10/20/2017 10/25/2017 ""    0      0      0   
 

Для более старой версии dplyr использования :

 df %>%
  group_by(ID) %>%
  summarise_at(vars(eventdate1:index3), ~{
    x <- .[.!='']
    if(length(x)) last(x) else ''
  }) -> result
 

данные

 df <- structure(list(ID = c(1L, 1L, 1L, 1L), event = c("before", "now", 
"later", "tomo"), eventdate1 = c("", "", "03/02/2020", "05/05/2020"
), date2 = c("1/22/2020", "", "", ""), date3 = c("", "10/20/2017", 
"", ""), date4 = c("", "10/25/2017", "", ""), date5 = c("", "", 
"", ""), index1 = c("", "", "0", "0"), index2 = c("", "", "1", "0"), 
index3 = c("", "", "0", "0")), row.names = c(NA, -4L), class = "data.frame")
 

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

1. Ошибка в методе использования («group_by_»): нет применимого метода для ‘group_by_’, применяемого к объекту класса «функция»

2. @AishwaryaPrabhu Пожалуйста, замените df на имя вашего фрейма данных.

3. Ошибка в summarise_impl (.data, точки): ошибка оценки: не удалось найти функцию «поперек».

4. across присутствует в более новой версии dplyr , т.е. 1.0.0 или выше. Вы можете обновить свой пакет install.packages('dplyr') до последней версии или просмотреть обновленный ответ с summarise_at помощью .

5. Там не хватало нескольких пакетов, но это сработало. Спасибо. Я кое-что узнал