我有一个数据帧("df"(,它有大约50列,我想(1( 乘以"weight"列(df$weight(,然后(2( 按组求和(df$GEOID(。我想在我的数据帧中添加一个带乘积("var.prod"(的列和一个带sum("var.sum"(的栏。
我已经想好了如何手动完成这项工作,但我想知道是否有更快或更优雅的解决方案。我是R的新手,所以任何反馈都会很有帮助——提前谢谢!
这是我迄今为止所尝试的(在这个例子中我只列出了6个变量(。
vlist <- c("gini", "pov", "medinc", "pop", "inc", "pct.unemploy")
for (v in vlist) {
df[paste0(v,".prod")] <- df[paste0(v)]*df$weight
}
df <- df %>%
group_by(GEOID) %>%
mutate(gini.sum = sum(gini.prod),
pov.sum = sum(pov.prod),
medinc.sum = sum(medinc.prod),
pop.sum = sum(pop.prod),
inc.sum = sum(inc.prod),
pct.unemploy.sum = sum(pct.unemploy.prod))
**此外,我正在处理一个空间数据帧,所以我不能使用data.table函数。**
编辑后添加:我正在使用受限制的数据,所以很遗憾我无法共享我的数据。但这是我现在数据的一个例子:
GEOID gini weight
1 0.31 0.8
1 0.45 0.2
2 0.37 1
3 0.42 1
这是我的预期输出:
GEOID gini weight gini.prod gini.sum
1 0.31 0.8 0.248 0.338
1 0.45 0.2 0.09 0.338
2 0.37 1 0.37 0.37
3 0.42 1 0.42 0.42
我们可以使用mutate_at
library(dplyr)
library(stringr)
df <- df %>%
group_by(GEOID) %>%
mutate_at(vars(str_c(vlist, ".prod")),
list(sum = ~ sum(., na.rm = TRUE)))
或使用mutate
和across
df <- df %>%
group_by(GEOID) %>%
mutate(across(str_c(vlist, ".prod")), list(sum = sum)))
使用data.table
,您可以执行:
library(data.table)
setDT(df)
vlist <- c("gini", "pov", "medinc", "pop", "inc", "pct.unemploy")
df[, (lapply(.SD, sum)), by = "GEOID", .SDcols = paste0(vlist, ".prod")]
如果你想要特定的名称:
setnames(df, old = c("GEOID", paste0("V", 1:length(vlist)),
new = c("GEOID", paste0(vlist, ".sum"))
)