次のダミーデータがあります。
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))
2つの製品と国の組み合わせを選択します
sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))
そして、各組み合わせの値を並べて表示したいと思います。 dcast
でこれを行うことができます:
sdt %>% dcast(Year ~ Product + Country)
パッケージのspread
でこれを行うことは可能ですかtidyr?
1つのオプションは、「Product」列と「Country」列をpaste
で結合して新しい「Prod_Count」を作成し、それらの列を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
から(@beetrootのコメントから)tidyr
を使用して、以前のように形状を変更することにより、いくつかの手順を回避できます。
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
Tidyrの現在の開発バージョンでは、これは1つの関数呼び出し(pivot_wider()
)で実現できます。
pivot_wider()
(カウンターパート:pivot_longer()
)はspread()
と同様に機能します。ただし、複数のキー/名前列(および/または複数の値列)を使用するなどの追加機能を提供します。このため、引数names_from
—これは、どの列から新しい変数の名前が取得されるかを示します—複数の列名(ここではProduct
およびCountry
)を取ることができます。
library("tidyr")
packageVersion("tidyr")
#> [1] '0.8.3.9000'
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