列名包含模式的过滤变量

Ani*_*ill 2 regex r dplyr tidyverse

我试图筛选出NANaNInf值一出来tbl使用dyplrfilter功能。

诀窍是我只想将过滤器应用于名称包含特定模式的列。模式为:r1、r2、r3等。

我试图结合grepfilter实现这一点,但无法让它发挥作用。我当前的代码如下所示:

filter_(!is.na(grep("r[1-9]", colnames(DF), value = TRUE)) 
& !is.infinite(grep("r[1-9]", colnames(DF), value = TRUE)) 
& !is.nan(grep("r[1-9]", colnames(DF), value = TRUE)))
Run Code Online (Sandbox Code Playgroud)

但是,此代码会返回一条警告消息:“Truncating vector to length 1”。并且返回的数据是未经过滤的。

我怀疑它是is.na这里的功能所引起的问题,因为我已经看到了一个例子网上,你可以申请grepfilter使用正常的状态(即condition == value)和基于没有条件is.na

pac*_*ese 5

dplyr提供matches()对此有用的

示例 1:如何matches()工作?

library(dplyr)

# remove columns that start with "mp"
mtcars %>% select(-matches("mp"))

# keep columns that start with "mp"
mtcars %>% select(matches("mp"))
Run Code Online (Sandbox Code Playgroud)

示例 2:matches()在您的请求上下文中使用但使用 MWE

# Create a dummy dataset
data = tibble(id = c("John","Paul","George","Ringo"),
              r1 = c(1,2,NA,NA), 
              r2 = c(1,2,NA,4),
              s1 = c(1,NA,3,4))

# Filter NAs in columns that start with r followed by a number
data %>% filter_at(vars(matches("r[0-9]")), all_vars(!is.na(.)))
Run Code Online (Sandbox Code Playgroud)


eip*_*i10 5

通过dplyr,您可以使用该filter_at功能:

dat %>% filter_at(vars(matches("^r[1-9]")), all_vars(is.finite(.)))
Run Code Online (Sandbox Code Playgroud)

使用@lmo的样本数据,结果是:

  r1 r2         d
1  1  1 0.2774292
Run Code Online (Sandbox Code Playgroud)