玩具数据:
set.seed(1)
data <- data.frame(Output_manufacturing = runif(5),
Output_agriculture = runif(5),
Prices_manufacturing = runif(5),
Prices_agriculture = runif(5))
我认为你想要做的是这个。
vars <- c("Output","Prices")
for (var in vars) {
data <- data %>%
mutate(!!sym(paste0(var, "_Total")) :=
!!sym(paste0(var, "_manufacturing")) +
!!sym(paste0(var, "_agriculture")))
}
data
#> Output_manufacturing Output_agriculture Prices_manufacturing Prices_agriculture Output_Total Prices_Total
#> 1 0.2655087 0.89838968 0.2059746 0.4976992 1.1638983 0.7036738
#> 2 0.3721239 0.94467527 0.1765568 0.7176185 1.3167992 0.8941753
#> 3 0.5728534 0.66079779 0.6870228 0.9919061 1.2336512 1.6789289
#> 4 0.9082078 0.62911404 0.3841037 0.3800352 1.5373218 0.7641389
#> 5 0.2016819 0.06178627 0.7698414 0.7774452 0.2634682 1.5472866
dplyr 的另一种方式是:
library(dplyr)
vars <- c("Output","Prices")
data <- data %>% rowwise()
for (var in vars)
data <- data %>% mutate("{var}_Total" := sum(c_across(starts_with(var))))
data <- data %>% ungroup()
使用基础 R:
# vars you want to sum
vars <- c("Output","Prices")
# get position of the vars to sum
v <- grep(paste0("^", vars, collapse = "|"), names(data))
# sum cols
data[vars] <- lapply(split.default(data[v], sub('(.*)_.*','\\1_Total', names(data[v]))), rowSums)
这对于您想要求和的列数很灵活。