如何使用 mutate(across()) 中的字符串引用 ifelse() 函数的参数

问题描述 投票:0回答:1

假设我有这个示例数据:

library(tidyverse)

colNames <- c('A', 'B')

df <- tibble(A = sample(1:1000, 20),
             A_Direction = 'Decreasing',
             B = sample(1:1000, 20),
             B_Direction = 'Increasing')

我想更改列

A
B
,这样如果
A_Direction
B_Direction
减少,则为0,如果增加,则为1。这是我尝试过的:

dfNew <- df %>%
  mutate(across(.cols = matches(paste0('^', colNames, '$')),
                .fns = ~ifelse(test = paste0(cur_column(), '_Direction')=='Decreasing',
                               yes = 0,
                               no = 1)))

但是,当然,它无法识别

test
参数,因为它是一个字符串,因此两列都变成
1
。我有什么想法可以通过编程来完成这个任务(OG 数据有很多很多这样的列)。

非常感谢!

r
1个回答
0
投票

如果您已经拥有

colNames
,您可以这样做:

library(dplyr)
library(stringr)

lookup <- setNames(str_c(colNames, "_", "Direction"), colNames)

df |>
  mutate(across(all_of(colNames), \(x) as.numeric(pick(all_of(lookup[[cur_column()]]))[[1]] == "Increasing")))
© www.soinside.com 2019 - 2024. All rights reserved.