我想过滤数据框,以便只保留其中包含值 1、2、3、4、5 或 NA 的列。
x = data.frame(col1 = c("a" , "b", "d", "e", "f", "g"),
col2 = c(12, 45, 235, 2134, NA, 1),
col3 = c(1, 2, 3, 1, 2, NA),
col4 = c(1, 2, 3, 4, 5, NA),
col5 = c(1, 2, 3, 4, 5, 6))
对于此示例数据,我想返回仅包含第 3 列和第 4 列的 x。
最佳答案
您可以使用以下解决方案:
library(dplyr)
x %>%
select(where(function(x) all(x %in% c(1:5, NA))))
col3 col4
1 1 1
2 2 2
3 3 3
4 1 4
5 2 5
6 NA NA
或者使用公式:
x %>%
select(where(~ all(.x %in% c(1:5, NA))))
由于对此的讨论刚刚升温,如果您想知道 R 如何解释由 ~
发音为 twiddle
创建的公式,只需将其包装在 中即可purrr::as_mapper
。当您将此语法用于匿名函数时,这是 R 在幕后调用的函数:
as_mapper(~ all(.x %in% c(1:5, NA)))
<lambda>
function (..., .x = ..1, .y = ..2, . = ..1)
all(.x %in% c(1:5, NA))
attr(,"class")
[1] "rlang_lambda_function" "function"
这里.x
参数相当于我们匿名函数的第一个参数。
关于r - 选择仅包含外部列表中的值的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69817989/