#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")