R语言 在中使用列名称的子字符串

8aqjt8rx  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(148)

我有以下建议:

df <- tibble(
  x = c(5, 5),
  Column_1 = c(0.5, 0.5),
  Column_2 = c(0.75, 0.75))

我想创建两个新列,它们分别是列x与Column_1和x与Column_2的乘积。这两个列应命名为ABC_1和ABC_2。
我尝试了以下代码:

df <- mutate(df,
  across(starts_with("Column_"),
              function(y) y * x,
              .names = paste0("ABC", gsub("Column_", "", "{.col}"))
        ))

但是,这会产生下表:
| X射线|栏_1|列_2| ABC列_1| ABC列_2|
| - -|- -|- -|- -|- -|
| 五个|0.5分|零点七五|二点五|三点七五|
| 五个|0.5分|零点七五|二点五|三点七五|
生成的列现在命名为ABCColumn_1和ABCColumn_2。不知何故,使用gsub创建子字符串不起作用。我希望的输出是:
| X射线|栏_1|列_2| ABC_1语言|ABC_2系列|
| - -|- -|- -|- -|- -|
| 五个|0.5分|零点七五|二点五|三点七五|
| 五个|0.5分|零点七五|二点五|三点七五|
有什么想法我可以优雅地解决这个问题吗?在现实中,列数是可变的,所以我不能硬编码1和2到我的脚本。
编辑:对不起,我的通用列名选择得不好。我选择了一个不同的列名,以表明旧列名和新列名不应该以任何方式相关,除了数字。

2ic8powd

2ic8powd1#

across().names参数中使用的粘附字符串计算调用,以便您可以执行以下操作:

library(dplyr)

df %>%
  mutate(across(starts_with("Column"), ~ x * .x, .names = "ABC_{seq_along(.col)}"))

# A tibble: 2 × 5
      x Column_1 Column_2 ABC_1 ABC_2
  <dbl>    <dbl>    <dbl> <dbl> <dbl>
1     5      0.5     0.75   2.5  3.75
2     5      0.5     0.75   2.5  3.75

或者在胶串中使用sub()

df %>%
  mutate(across(starts_with("Column"), ~ x * .x, .names = "{sub('Column', 'ABC', .col)}"))
bgtovc5b

bgtovc5b2#

df <- mutate(df,
                 across(starts_with("Column_"),
                        function(y) y * x,
                        .names = paste0("New", gsub("Column_", "", "{.col}"))
                 ))

相关问题