是否有可能使用类似于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)) 

我select了两个产品 – 国家组合

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

我想看看每个组合的价值观。 我可以用dcast做到这dcast

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

是否有可能从包裹tidyr spread做到这一点

一种select是通过pastejoin“产品”和“国家”列来创build新的“产品计数”,使用从tidyr spreadselect从“长”到“宽”重新移除这些列。

  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 

或者,我们可以通过使用tidyr (从@ tidyr的评论) unite ,并像以前一样重塑,从而避免几个步骤。

  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