r - 将多个长到宽的转换合并为一个
问题描述
我需要将多列从长转换为宽,下面的步骤是我目前的做法。有没有办法将其推广到任意数量的列?在我当前的用例中,聚合和强制转换总是在var_1
下面的代码中的相同变量上,最好但不是必要的解决方案将允许我var_1
用于强制转换City
和var_2
强制转换Month
。我对data.table
,tidyr
或基本 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))
推荐阅读
- python - 我如何创建一个包含在应用程序中的 tkinter 应用程序更新程序
- php - 如果我创建了另一个用户模型,是否可以在 Laravel 中实现 ActingAs() 函数?
- java - 将字符串的 ArrayList 插入 MySQL JDBC 中的表中
- python - Python - win32 - 下划线
- python - Python spark:如何在 databricks 中使用 spark 并行化 Spark Dataframe 计算
- ios - 如何将解析后的数据存储在数组中?
- anylogic - 如何找出将“agent.remove”发送到我的 moveTo 块的内容?
- python - 如何从字符串中分离整数并将其转换为浮点数
- php - Laravel - 返回对 AJAX 请求的响应后继续运行功能
- c++ - 在 Windows 上使用 CMake 强制静态链接