假设我有这个示例数据:
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
orB_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 数据有很多很多这样的列)。
另一种选择是将列名称包装
paste0(cur_column(), "_Direction")
在 中get
。注意:我还删除了
ifelse
.或使用
pick()
:如果你已经有了,
colNames
你可以进行命名向量查找:或者您可以像这样访问
across()
:最后,如果您的真实数据具有更多值而不仅仅是增加/减少,您可以
case_match()
像这样使用,它也有一个default
参数:只需添加更多值,如图所示(例如
"Constant" ~ NA
)。pick()
使用(而不是像df
我在帖子评论中提到的那样)的优点是,如果您修改了管道中的变量,则此函数将检索当前状态的值:这是一个实用的解决方法: