首页 > 解决方案 > 按名称划分列

问题描述

我有一个带有 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

标签: rdplyrapplytidyverse

解决方案


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, .)

推荐阅读