是否可以在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/