首页 > 解决方案 > 引用 dplyr 的 cross() 中的列名

问题描述

是否可以在内部的 lambda 函数中引用列across()

df <- tibble(age = c(12, 45), sex = c('f', 'f'))
allowed_values <- list(age = 18:100, sex = c("f", "m"))

df %>%
  mutate(across(c(age, sex),
                c(valid = ~ .x %in% allowed_values[[COLNAME]])))

我刚刚遇到了这个问题,其中 OP 询问基于允许值列表验证数据框中的列。

dplyr刚刚获得across(),这似乎是一个自然的选择,但我们需要列名来查找允许的值。

我能想到的最好的方法是调用imap_dfr,但是集成到分析管道中更加麻烦,因为需要将结果与原始数据帧重新组合。

标签: rdplyrtidyverse

解决方案


答案是肯定的,可以参考dplyr's中的列名across。你需要使用cur_column(). 你原来的答案是如此接近!cur_column()在您想要列名的位置插入您的解决方案:

library(tidyverse)

df <- tibble(age = c(12, 45), sex = c('f', 'f'))
allowed_values <- list(age = 18:100, sex = c("f", "m"))

df %>%
  mutate(across(c(age, sex),
                c(valid = ~ .x %in% allowed_values[[cur_column()]])
                )
         )

参考:https ://dplyr.tidyverse.org/articles/colwise.html#current-column


推荐阅读