Объединение строк в одну строку с несколькими столбцами данных R

#r #reshape #tidyr

#r #изменение формы #tidyr

Вопрос:

У меня есть набор данных, который измеряет условия веса до и после. Я пытался объединить строки с похожими идентификаторами в одну строку и создать два дополнительных столбца, чтобы показать результаты для pre и post для каждого идентификатора.

Исходная таблица

ИДЕНТИФИКАТОР Пол ВРЕМЯ гонки SH PRE_WEIGHT POST_WEIGHT
1 БЕЛАЯ ЖЕНЩИНА пишет плохо 168 152
1 ЖЕНСКИЙ белый ПРЕДВАРИТЕЛЬНО хороший 168 152
2 МУЖЧИНЫ-латиноамериканцы пишут очень плохо 157 143
2 МУЖЧИНЫ испаноязычные бедные 157 143
3 ЖЕНСКИЙ черный ПОСТ Хорошо 129 118
3 ЖЕНСКИЙ черный ПРЕДВАРИТЕЛЬНО удовлетворительный 129 118

Результаты должны выглядеть следующим образом:

ИДЕНТИФИКАТОР Пол Время гонки SH PRE_WEIGHT POST_WEIGHT TIME_PRE TIME_POST SH_PRE SH_POST
1 БЕЛАЯ ЖЕНЩИНА СООБЩЕНИЕ плохое 168 152 СООБЩЕНИЕ ПРЕДВАРИТЕЛЬНО плохое Хорошее
2 МУЖЧИНЫ-латиноамериканцы Очень бедные 157 143 СООБЩЕНИЯ ДО Очень бедные Бедные
3 ЖЕНСКИЙ черный ПОСТ Хорошо 129 118 ПОСТ ПРЕДВАРИТЕЛЬНО Хорошо Удовлетворительно

Я пытался сделать это с помощью изменения формы, которое работает очень медленно и не работает. Я также не смог изменить форму таблицы с помощью tidyr.

Надеюсь, что кто-нибудь может мне в этом помочь.

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

1. Могу ли я спросить, почему вы сохраняете исходные столбцы TIME SH и создаете TIME_PRE и TIME_POST поскольку они не добавляют никакой полезной информации после свертывания строк?

2. Извините, да, вы правы, я просто забыл удалить это в примере. В них нет необходимости.

3. Попробуйте df %>% pivot_wider(names_from = TIME,values_from=SH) tidyverse сначала загрузить пакет!

4. Спасибо, это тоже сработало.

Ответ №1:

Опция с data.table

 library(data.table)
dcast(setDT(df1), ID   Sex   Race    PRE_WEIGHT   
           POST_WEIGHT ~ TIME, value.var = 'SH')
  

-вывод

 #   ID    Sex     Race PRE_WEIGHT POST_WEIGHT      POST          PRE
#1:  1 FEMALE    White        168         152      Poor         Good
2#:  2   MALE Hispanic        157         143 Very Poor         Poor
3#:  3 FEMALE    Black        129         118      Good Satisfactory
  

Ответ №2:

Простой базовый параметр R может использовать reshape , например,

 reshape(
  df,
  direction = "wide",
  idvar = c("ID","Sex","Race"),
  timevar = "TIME"
)
  

что дает

   ID    Sex     Race   SH.POST PRE_WEIGHT.POST POST_WEIGHT.POST       SH.PRE
1  1 FEMALE    White      Poor             168              152         Good
3  2   MALE Hispanic Very Poor             157              143         Poor
5  3 FEMALE    Black      Good             129              118 Satisfactory
  PRE_WEIGHT.PRE POST_WEIGHT.PRE
1            168             152
3            157             143
5            129             118
  

Данные

 > dput(df)
structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L), Sex = c("FEMALE", 
"FEMALE", "MALE", "MALE", "FEMALE", "FEMALE"), Race = c("White",
"White", "Hispanic", "Hispanic", "Black", "Black"), TIME = c("POST", 
"PRE", "POST", "PRE", "POST", "PRE"), SH = c("Poor", "Good",
"Very Poor", "Poor", "Good", "Satisfactory"), PRE_WEIGHT = c(168L,
168L, 157L, 157L, 129L, 129L), POST_WEIGHT = c(152L, 152L, 143L,
143L, 118L, 118L)), class = "data.frame", row.names = c(NA, -6L
))
  

Ответ №3:

Как упоминал @Duck, вы можете сделать это

 library(dplyr)
library(tidyr)

df3 %>% 
   group_by(ID) %>% 
   pivot_wider(names_from = TIME, 
               values_from = SH, 
               names_prefix = "SH_")

#> # A tibble: 3 x 7
#> # Groups:   ID [3]
#>      ID Sex    Race     PRE_WEIGHT POST_WEIGHT SH_POST   SH_PRE      
#>   <dbl> <chr>  <chr>         <dbl>       <dbl> <chr>     <chr>       
#> 1     1 FEMALE White           168         152 Poor      Good        
#> 2     2 MALE   Hispanic        157         143 Very Poor Poor        
#> 3     3 FEMALE Black           129         118 Good      Satisfactory
  

Ваши данные

 df3 <- readr::read_table("
ID  Sex         Race        TIME    SH           PRE_WEIGHT POST_WEIGHT
1   FEMALE      White       POST    Poor         168            152
1   FEMALE      White       PRE     Good         168            152
2   MALE        Hispanic    POST    Very Poor    157            143
2   MALE        Hispanic    PRE     Poor         157            143
3   FEMALE      Black       POST    Good         129            118
3   FEMALE      Black       PRE     Satisfactory 129            118")