web-dev-qa-db-ja.com

dcastと同様に、tidyrの複数の列でスプレッドを使用できますか?

次のダミーデータがあります。

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

61
mpiktas

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
59
akrun

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

参照: https://tidyr.tidyverse.org/dev/articles/pivot.html

4
hplieninger