Можно ли использовать спред на нескольких столбцах в 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?
Ответы
Ответ 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