【问题标题】:Using dplyr to compute calculated fields depending on multiple columns without explicitly writing column names使用 dplyr 根据多列计算计算字段,而无需显式写入列名
【发布时间】:2021-06-14 18:58:54
【问题描述】:

考虑下面的代码。

set.seed(56)
library(dplyr)

df <- data.frame(
  NUM_1 = sample.int(500, replace = TRUE),
  DENOM_1 = sample.int(500, replace = TRUE),
  NUM_2 = sample.int(500, replace = TRUE),
  DENOM_2 = sample.int(500, replace = TRUE)
)

head(df)

  NUM_1 DENOM_1 NUM_2 DENOM_2
1   417     379   154     173
2   160     437   239     154
3   243     315   106     361
4   291     169   393     340
5   170     450   429     421
6   422     131    75      64

无需手动指定每个列名(实际问题有大约 40 个我需要创建),我想为其创建列 FRAC_1FRAC_2 FRAC_X = NUM_X/DENOM_X.

所以,这将是我正在寻找的关于输出的内容,但由于我正在处理其中大约 40 个,我不想手动输入每一列:

df_frac <- df %>%
  mutate(FRAC_1 = NUM_1 / DENOM_1,
         FRAC_2 = NUM_2 / DENOM_2)

head(df_frac)

  NUM_1 DENOM_1 NUM_2 DENOM_2    FRAC_1    FRAC_2
1   417     379   154     173 1.1002639 0.8901734
2   160     437   239     154 0.3661327 1.5519481
3   243     315   106     361 0.7714286 0.2936288
4   291     169   393     340 1.7218935 1.1558824
5   170     450   429     421 0.3777778 1.0190024
6   422     131    75      64 3.2213740 1.1718750

对此,我强烈希望使用dplyr 解决方案。我想也许我可以将mutate()across() 一起使用,但我不清楚如何告诉across()NUM_x 与相应的DENOM_x 列配对。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是tidyverse中的一个

    1. 循环across名称为starts_with'NUM'的列
    2. 提取列名cur_column(),将str_replace中的“NUM”子串替换为“DENOM”
    3. get 列值,除以 NUM 列,并更改 .names 中的列名以创建“FRAC”列
    library(dplyr)
    library(stringr)
    df <- df %>% 
         mutate(across(starts_with("NUM"), ~ 
            ./get(str_replace(cur_column(), 'NUM', 'DENOM')), 
           .names = "{str_replace(.col, 'NUM', 'FRAC')}"))
    

    -输出

    head(df)
    NUM_1 DENOM_1 NUM_2 DENOM_2    FRAC_1    FRAC_2
    1   417     379   154     173 1.1002639 0.8901734
    2   160     437   239     154 0.3661327 1.5519481
    3   243     315   106     361 0.7714286 0.2936288
    4   291     169   393     340 1.7218935 1.1558824
    5   170     450   429     421 0.3777778 1.0190024
    6   422     131    75      64 3.2213740 1.1718750
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2017-12-23
      • 2014-02-08
      • 2018-07-01
      相关资源
      最近更新 更多