如何转换一组列并在R中动态重命名它们



我有一个数据帧("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)))

或使用mutateacross

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"))
)

最新更新