【问题标题】:Parallel mutate across a dynamic amount of columns in R Tidyverse在 R Tidyverse 中的动态列中并行变异
【发布时间】:2021-10-11 00:43:59
【问题描述】:

我有一个代码会生成一个小标题

  • 1 个标识符列

  • 1 col T 带数值

  • 具有数值的 X 列,命名为 A_1、A_2、A_3、...、A_X

我的输出必须是

X 列名为 B_1、B_2、B_3、...、B_X,其数值满足

B_X[z] = A_X[z] * T[z]

如果 X = 1,代码会很简单:

Tibble %>%
mutate(B = A * T)

问题是我不知道 X 的值。 基本上我需要for (i in 1:X) {Tibble %>% add_column() -> Tibble},但我几乎可以肯定有更好的解决方案,特别是因为我想避免分配并继续总结 B-cols。

谢谢。

【问题讨论】:

  • df %>% mutate(across(starts_with('A'), .names = "B_{str_extract(col, '[0-9]+$')}") * T)

标签: r


【解决方案1】:

你可以这样做:

df %>% 
   mutate(across(starts_with('A'), .names = "B_{str_extract(col, '[0-9]+$')}") * T)

甚至:

df %>% 
   mutate(across(starts_with('A'), ~.x*T, .names = "B_{str_extract(col, '[0-9]+$')}"))

【讨论】:

    【解决方案2】:

    您可以使用grep 使列相乘,并将它们与T 列相乘应该很简单。使用基础 R,您可以执行以下操作 -

    df <- data.frame(ID = 1:5, T = c(2, 4, 5, 6, 1), A_1 = c(3, 4, 5, 1, 2), 
                     A_2 = 1:5, A_3 = c(7, 8, 3, 2, 9))
    
    cols <- grep('A_\\d+', names(df), value = TRUE)
    df[sub('A', 'B', cols)] <- df$T * df[cols]
    df
    
    #  ID T A_1 A_2 A_3 B_1 B_2 B_3
    #1  1 2   3   1   7   6   2  14
    #2  2 4   4   2   8  16   8  32
    #3  3 5   5   3   3  25  15  15
    #4  4 6   1   4   2   6  24  12
    #5  5 1   2   5   9   2   5   9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2019-05-30
      • 2016-06-19
      • 2021-10-10
      • 2022-10-14
      相关资源
      最近更新 更多