在dplyrcross()中引用列名

标签 r dplyr tidyverse

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

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]])))

我刚遇到this question,其中OP询问有关基于允许值列表验证数据框中的列的信息。
dplyr刚刚获得了across(),这似乎是很自然的选择,但是我们需要列名称来查找允许的值。

The best I could come up with是对imap_dfr的调用,但是将其集成到分析管道中比较麻烦,因为需要将结果与原始数据帧重新组合。

最佳答案

我认为您此时可能对across的要求过多(但这可能会刺激额外的开发,因此也许有一天它会按照您的建议进行工作)。

我认为purrr包中的imap函数可能会为您提供所需的信息:

> df <- tibble(age = c(12, 45), sex = c('f', 'f'))
> allowed_values <- list(age = 18:100, sex = c("f", "m"))
> 
> df %>% imap( ~ .x %in% allowed_values[[.y]])
$age
[1] FALSE  TRUE

$sex
[1] TRUE TRUE

> df %>% imap_dfc( ~ .x %in% allowed_values[[.y]])
# A tibble: 2 x 2
  age   sex  
  <lgl> <lgl>
1 FALSE TRUE 
2 TRUE  TRUE 

如果您想要具有合并有效性的单列,则可以通过reduce传递结果:
> df %>% imap( ~ .x %in% allowed_values[[.y]]) %>%
+   reduce(`&`)
[1] FALSE  TRUE

然后可以将其作为新列添加到原始数据,或仅用于子集数据。我对tidyverse不够专业,但还不知道是否可以将其与mutate组合以直接添加列。

关于在dplyrcross()中引用列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62155957/

相关文章:

r - 给定类型 min_date 和 max_date 的聚合 ID 随时间变化

r - ggplot2 在使用自定义 x 轴限制绘制直方图时丢失数据

r - 如果 R 中满足条件,则打印列中的值

r - 每行的 data.table 函数太慢

r - dplyr tidyeval 相当于下划线函数版本

用带标签的增量键替换 NA 值

r - 可以 read_csv 解析 m/d/Y H :M:S AM/PM vector?

r - 从稀疏表构建网络边缘表

r - 从 R 中的宽数据一次创建多个新的长列?

html - 使用 rvest 包提取两条 html 水平线之间的文本