Подтвердить что ты не робот

Можно ли использовать спред на нескольких столбцах в tidyr, подобном dcast?

У меня есть следующие фиктивные данные:

library(dplyr)
library(tidyr)
library(reshape2)
dt <- expand.grid(Year = 1990:2014, Product=LETTERS[1:8], Country = paste0(LETTERS, "I")) %>%   select(Product, Country, Year)
dt$value <- rnorm(nrow(dt))

Я выбираю две комбинации продуктов:

sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))

и я хочу видеть значения рядом друг с другом для каждой комбинации. Я могу сделать это с помощью dcast:

sdt %>% dcast(Year ~ Product + Country)

Можно ли сделать это с помощью spread из пакета tidyr?

4b9b3361

Ответ 1

Одним из вариантов было бы создать новый "Prod_Count", присоединив столбцы "Продукт" и "Страна" на paste, удалите эти столбцы с помощью select и измените форму с 'long' на 'wide', используя spread от tidyr.

 library(dplyr)
 library(tidyr)
 sdt %>%
 mutate(Prod_Count=paste(Product, Country, sep="_")) %>%
 select(-Product, -Country)%>% 
 spread(Prod_Count, value)%>%
 head(2)
 #  Year      A_AI       B_EI
 #1 1990 0.7878674  0.2486044
 #2 1991 0.2343285 -1.1694878

Или мы можем избежать нескольких шагов, используя unite из tidyr (из комментария @beetroot) и изменим форму по-прежнему.

 sdt%>% 
 unite(Prod_Count, Product,Country) %>%
 spread(Prod_Count, value)%>% 
 head(2)
 #   Year      A_AI       B_EI
 # 1 1990 0.7878674  0.2486044
 # 2 1991 0.2343285 -1.1694878

Ответ 2

С новой функцией pivot_wider(), представленной в tidyr версии 1.0.0, это можно сделать одним вызовом функции.

pivot_wider() (аналог: pivot_longer()) работает аналогично spread(). Тем не менее, он предлагает дополнительные функции, такие как использование нескольких столбцов ключ/имя (и/или несколько столбцов значений). С этой целью аргумент names_from &— указывает, из какого столбца (столбцов) взяты имена новых переменных &— может принимать более одного имени столбца (здесь Product и Country).

library("tidyr")

sdt %>% 
    pivot_wider(id_cols = Year,
                names_from = c(Product, Country)) %>% 
    head(2)
#> # A tibble: 2 x 3
#>     Year   A_AI    B_EI
#>    <int>  <dbl>   <dbl>
#>  1  1990 -2.08  -0.113 
#>  2  1991 -1.02  -0.0546

Смотрите также: https://tidyr.tidyverse.org/articles/pivot.html