R lapply 循环到灵活的向量中并通过后缀重命名变量
R lapply looping into flexible vector and rename variable through suffix
我有一个灵活的组合向量(在现实生活中它可能会有很大变化并且取决于外部 table,所以我不能切片或使用交叉,或者取决于变量名称本身的东西在我的 df 中)。
我想 group/sum 我的 df 中的变量,其名称与“可能梳”向量中的名称相匹配。然后应用“_sum”后缀输出变量名,例如Jon.A_sum.
在我的 df 中,我有几个变量,不是所有的都应该加起来,而只是一个与“可能的组合”名称匹配的选定的和灵活的列表。
在这段代码中,我想念如何在 lapply 步骤中使用 _sum 后缀重命名输出变量(如果可能的话),但我愿意接受其他循环方法。
possible_comb <- c("Jon.A", "Bill.C", "Maria.E", "Ben.D")
Jon.A <- c(23, 41, 32, 58, 26)
Bill.C <- c(13, 41, 35, 18, 66)
v3 <- c(3,34, 33, 34, 23)
weight <- c(2, 2, 3,3, 6)
df <- data.frame(Jon.A,Bill.C,v3,weight)
setDT(df)
df_grouped<- df[, lapply(.SD, sum), by=c("weight") , .SDcols=possible_comb]
#wanted results
Jon.A_sum <- c(64, 90, 26)
Bill.C_sum <- c(54,53, 66)
weight <- c(2,3, 6)
wanted <- data.frame(Jon.A_sum,Bill.C_sum,weight)
如果我正确理解你想要的输出,你可以这样做:
cols_to_use <- possible_comb[names(df) %in% possible_comb]
df_grouped<- df[, lapply(.SD, sum), by=c("weight") , .SDcols = cols_to_use]
setcolorder(df_grouped, cols_to_use)
setnames(df_grouped, old = cols_to_use, new = paste(cols_to_use, "sum", sep = "_"))
data.table
解-
library(data.table)
possible_comb <- c("Jon.A", "Bill.C")
new_cols <- paste0(possible_comb, '_sum')
df_grouped<- df[, setNames(lapply(.SD, sum), new_cols),
by=c("weight") , .SDcols=possible_comb]
df_grouped
# weight Jon.A_sum Bill.C_sum
#1: 2 64 54
#2: 3 90 53
#3: 6 26 66
在 dplyr
中,您可以将 across
与 group_by
一起使用,并使用 .names
分配新名称。
library(dplyr)
df %>%
group_by(weight) %>%
summarise(across(all_of(possible_comb), sum, .names = '{col}_sum'))
# weight Jon.A_sum Bill.C_sum
# <dbl> <dbl> <dbl>
#1 2 64 54
#2 3 90 53
#3 6 26 66
我有一个灵活的组合向量(在现实生活中它可能会有很大变化并且取决于外部 table,所以我不能切片或使用交叉,或者取决于变量名称本身的东西在我的 df 中)。
我想 group/sum 我的 df 中的变量,其名称与“可能梳”向量中的名称相匹配。然后应用“_sum”后缀输出变量名,例如Jon.A_sum.
在我的 df 中,我有几个变量,不是所有的都应该加起来,而只是一个与“可能的组合”名称匹配的选定的和灵活的列表。
在这段代码中,我想念如何在 lapply 步骤中使用 _sum 后缀重命名输出变量(如果可能的话),但我愿意接受其他循环方法。
possible_comb <- c("Jon.A", "Bill.C", "Maria.E", "Ben.D")
Jon.A <- c(23, 41, 32, 58, 26)
Bill.C <- c(13, 41, 35, 18, 66)
v3 <- c(3,34, 33, 34, 23)
weight <- c(2, 2, 3,3, 6)
df <- data.frame(Jon.A,Bill.C,v3,weight)
setDT(df)
df_grouped<- df[, lapply(.SD, sum), by=c("weight") , .SDcols=possible_comb]
#wanted results
Jon.A_sum <- c(64, 90, 26)
Bill.C_sum <- c(54,53, 66)
weight <- c(2,3, 6)
wanted <- data.frame(Jon.A_sum,Bill.C_sum,weight)
如果我正确理解你想要的输出,你可以这样做:
cols_to_use <- possible_comb[names(df) %in% possible_comb]
df_grouped<- df[, lapply(.SD, sum), by=c("weight") , .SDcols = cols_to_use]
setcolorder(df_grouped, cols_to_use)
setnames(df_grouped, old = cols_to_use, new = paste(cols_to_use, "sum", sep = "_"))
data.table
解-
library(data.table)
possible_comb <- c("Jon.A", "Bill.C")
new_cols <- paste0(possible_comb, '_sum')
df_grouped<- df[, setNames(lapply(.SD, sum), new_cols),
by=c("weight") , .SDcols=possible_comb]
df_grouped
# weight Jon.A_sum Bill.C_sum
#1: 2 64 54
#2: 3 90 53
#3: 6 26 66
在 dplyr
中,您可以将 across
与 group_by
一起使用,并使用 .names
分配新名称。
library(dplyr)
df %>%
group_by(weight) %>%
summarise(across(all_of(possible_comb), sum, .names = '{col}_sum'))
# weight Jon.A_sum Bill.C_sum
# <dbl> <dbl> <dbl>
#1 2 64 54
#2 3 90 53
#3 6 26 66