【问题标题】:divide columns by name按名称划分列
【发布时间】:2020-07-01 02:31:47
【问题描述】:

我有一个带有 ID 号(“tranche”)的节点名列表。我正在尝试由列名中的数字标识的 6 种不同策略。我想将“pl_sum”列除以它们相应的“clr”列。我希望将结果作为同一数据框中的添加列。

我认为它是某种应用函数,或者可能是 dplyr summarise_at 函数。但我无法让它工作。我会省去你完成任务的混乱尝试。

  nodename    tranche pl1_sum pl2_sum pl3_sum pl4_sum pl5_sum pl6_sum  clr1  clr2  clr3  clr4  clr5  clr6
  <chr>         <int>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <int> <int> <int> <int> <int> <int>
1 AECC_CSWS         1   -255.   -255.   -255.     0         0       0   160   160   160     0     0     0
2 AECC_CSWS         2   -310.   -310.   -310.     0         0       0   161   161   161     0     0     0
3 AECC_CSWS         3   -218.   -218.   -218.     0         0       0   172   172   172     0     0     0
4 AECC_CSWS         4   -375.   -375.   -375.    81.7       0       0   227   227   227    18     0     0
5 AECC_ELKINS       1   -266.   -266.   -266.     0         0       0   160   160   160     0     0     0
6 AECC_ELKINS       2   -336.   -336.   -356.     0         0       0   161   161   157     0     0     0

【问题讨论】:

    标签: r dplyr apply tidyverse


    【解决方案1】:

    base R中,我们可以使用grep找到'pl'列和对应的'cl'(假设两组列在数据集中的顺序相同)

    plcols <- grep("^pl\\d+_sum", names(df1), value = TRUE)
    clcols <- grep("^clr\\d+$", names(df1), value = TRUE)
    df1[paste0(plcols, "_by_", clcols)] <- df1[plcols]/df1[clcols]
    

    tidyverse 有多种选择,一种方法是map2

    library(dplyr)
    library(purrr)
    library(stringr)
    map2_dfc(df1[plcols], df1[clcols], `/`) %>%
         rename_all(~ str_c(., 'new')) %>%
         bind_cols(df1, .)
    

    【讨论】:

    • 谢谢。但是,我认为整洁的答案需要在包库之后的 plcols 和 clcols 定义。
    • @otterdog2000 我想,一旦我定义了它,就不必在 tidyverse 中重复它
    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多