【问题标题】:R lapply looping into flexible vector and rename variable through suffixR lapply循环进入灵活向量并通过后缀重命名变量
【发布时间】:2021-12-22 05:32:24
【问题描述】:

我有一个灵活的组合向量(在现实生活中它可能会有很大差异,并且取决于外部表,所以我不能切片或使用交叉,或者取决于我的 df 中变量的名称本身)。

我想对我的 df 中的变量进行分组/总结,其名称与“可能梳”向量中的名称匹配。然后将“_sum”后缀应用于输出变量名称,例如乔恩.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)

【问题讨论】:

    标签: r dataframe loops data.table apply


    【解决方案1】:

    如果我正确理解了您想要的输出,您可以执行以下操作:

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

    【讨论】:

    • 谢谢,但在您提出的解决方案中,我错过了要添加到输出变量名称的 _sum 后缀部分
    • 更新了答案以包含该内容
    【解决方案2】:

    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 中,您可以使用acrossgroup_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
    

    【讨论】:

    • 谢谢,但如果您看到我的 df_grouped,则 df 只有分组结果,而不是原始列
    • 我添加了一个“想要的”结果 df,谢谢
    • 相应地更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多