R 将多个从长到宽的转换组合为一个

R 将多个从长到宽的转换组合为一个,r,R,我需要将多列从长到宽进行转换。下面的步骤是我目前的做法。有没有办法将其推广到任意数量的列?在我当前的用例中,聚合和cast总是在同一个变量var_1上,在下面的代码中,最佳但非必要的解决方案将允许我对Citycast使用var_1,对Monthcast使用var_2。我对data.table、tidyr或base R解决方案很满意。谢谢 library(data.table) library(tidyverse) set.seed(100) dat=data.frame(G1=sample(LE

我需要将多列从长到宽进行转换。下面的步骤是我目前的做法。有没有办法将其推广到任意数量的列?在我当前的用例中,聚合和cast总是在同一个变量
var_1
上,在下面的代码中,最佳但非必要的解决方案将允许我对
City
cast使用
var_1
,对
Month
cast使用
var_2
。我对
data.table
tidyr
或base R解决方案很满意。谢谢

library(data.table)
library(tidyverse)
set.seed(100)
dat=data.frame(G1=sample(LETTERS[1:3],200,replace=TRUE),
               G2=sample(LETTERS[10:13],200,replace=TRUE),
               G3=sample(LETTERS[16:18],200,replace=TRUE),
               Month=rep(month.name[1:4],50),
               City=rep(c("LA","NYC","Charlotte","Bloomington"),50),
               var_1=sample.int(200,200),var_2=sample.int(200,200))

cityWide=dcast(setDT(dat), G1+G2+G3~ City,value.var="var_1",fill = 0L,fun.aggregate = sum)
monthWide=dcast(setDT(dat), G1+G2+G3~ Month,value.var="var_1",fill = 0L,fun.aggregate = sum)

wideData=cityWide %>% inner_join(monthWide,by=c("G1","G2","G3"))

也许我们可以使用
tidyverse

library(dplyr)
library(tidyr)
dat %>%
    group_by(G1, G2, G3, City) %>% 
    mutate(Sum_var1 = sum(var_1, na.rm = TRUE)) %>% 
    group_by(G1, G2, G3, Month) %>% 
    mutate(SumMonth_var1 = sum(var_1, na.rm = TRUE)) %>% 
    ungroup %>%
    select(G1, G2, G3, Month, City, Sum_var1, SumMonth_var1) %>% 
    distinct %>%
    pivot_wider(names_from = c(Month, City), values_from = c(Sum_var1, SumMonth_var1))

也许我们可以使用
tidyverse

library(dplyr)
library(tidyr)
dat %>%
    group_by(G1, G2, G3, City) %>% 
    mutate(Sum_var1 = sum(var_1, na.rm = TRUE)) %>% 
    group_by(G1, G2, G3, Month) %>% 
    mutate(SumMonth_var1 = sum(var_1, na.rm = TRUE)) %>% 
    ungroup %>%
    select(G1, G2, G3, Month, City, Sum_var1, SumMonth_var1) %>% 
    distinct %>%
    pivot_wider(names_from = c(Month, City), values_from = c(Sum_var1, SumMonth_var1))

您可以直接使用
pivot\u wide
将多列转换为多个变量,并在
values\u fn
中提供函数

tidyr::pivot_wider(dat, names_from = c(Month, City), 
                        values_from = c(var_1, var_2), values_fn = sum)
并使用
data.table
s
dcast

library(data.table)
dcast(setDT(dat), G1+G2+G3~Month+City, value.var = c('var_1', 'var_2'), 
      fun.aggregate = sum)

您可以直接使用
pivot\u wide
将多列转换为多个变量,并在
values\u fn
中提供函数

tidyr::pivot_wider(dat, names_from = c(Month, City), 
                        values_from = c(var_1, var_2), values_fn = sum)
并使用
data.table
s
dcast

library(data.table)
dcast(setDT(dat), G1+G2+G3~Month+City, value.var = c('var_1', 'var_2'), 
      fun.aggregate = sum)

您是否正在寻找类似的方法将多个列强制转换为多个变量
tidyr::pivot\u wider(dat,name\u from=c(月,城市),value\u from=c(var\u 1,var\u 2),value\u fn=sum)
?是的,这太棒了!我不得不在
values\u fn
参数中添加一个命名列表。您是否希望将多个列转换为多个变量
tidyr::pivot\u wider(dat,name\u from=c(月,城市),value\u from=c(var\u 1,var\u 2),value\u fn=sum)
?是的,这太棒了!我必须在
values\u fn
参数中添加一个命名列表,您想提交作为答案吗?