r - 根据元素而不是名称选择列

标签 r dplyr

假设我想选择所有包含 1 的列。

test.dat <- tibble(
  name = c("A","B","C"),
  alert_A = c(1,1,1),
  alert_B = c(1,1,0),
  alert_C = c(1,0,1),
  alert_D = c(1,0,0),
  alert_E = c(0,0,0)
)

> test.dat
# A tibble: 3 x 6
  name  alert_A alert_B alert_C alert_D alert_E
  <chr>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1 A           1       1       1       1       0
2 B           1       1       0       0       0
3 C           1       0       1       0       0
> test.want
# A tibble: 3 x 5
  name  alert_A alert_B alert_C alert_D
  <chr>   <dbl>   <dbl>   <dbl>   <dbl>
1 A           1       1       1       1
2 B           1       1       0       0
3 C           1       0       1       0

在 tidyselect 中,contains() 根据列的名称 上的字符串模式进行匹配。我想要的是根据某列是否包含数值来匹配。

我的猜测是在 select 中使用 is.element,但我该如何实现呢?

test.answer <- test.dat %>%
  select(name,~is.element(1,.))
#error

最佳答案

我们可以使用 where 检查类型以返回字符列 (is.character) 或 (|) 如果它是数字类型 (is.numeric),然后检查 any 值是否为 1

library(dplyr)
test.dat %>% 
   select(where(~ is.character(.)||(is.numeric(.) && any(. == 1))))

-输出

# A tibble: 3 x 5
#  name  alert_A alert_B alert_C alert_D
#  <chr>   <dbl>   <dbl>   <dbl>   <dbl>
#1 A           1       1       1       1
#2 B           1       1       0       0
#3 C           1       0       1       0

关于r - 根据元素而不是名称选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67221161/

相关文章:

r - left_join 不合并所有值

r - dplyr R 中的欧氏距离

r - 将图例添加到具有不同类型美学的 ggplot 直方图

r - 什么是 data.frame 可以做而 data.table 不能做的事情?

r - 如何使用dplyr复制使用自定义函数的ddply行为?

r - 等效于 dplyr 中的 Pandas iloc 函数

r - 顺序错误(datastate$c): argument 1 is not a vector

r - 在 ggplot2 中绘制多个函数并为它们添加图例

r - 如何在 R 中指定数据框的行和列

R - tbl/collect 有时很慢