R 将多个从长到宽的转换组合为一个
我需要将多列从长到宽进行转换。下面的步骤是我目前的做法。有没有办法将其推广到任意数量的列?在我当前的用例中,聚合和cast总是在同一个变量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
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
sdcast
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
sdcast
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
参数中添加一个命名列表,您想提交作为答案吗?