Ani*_*ill 2 regex r dplyr tidyverse
我试图筛选出NA,NaN和Inf值一出来tbl使用dyplr的filter功能。
诀窍是我只想将过滤器应用于名称包含特定模式的列。模式为:r1、r2、r3等。
我试图结合grep并filter实现这一点,但无法让它发挥作用。我当前的代码如下所示:
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这里的功能所引起的问题,因为我已经看到了一个例子网上,你可以申请grep到filter使用正常的状态(即condition == value)和基于没有条件is.na
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)
通过dplyr,您可以使用该filter_at功能:
dat %>% filter_at(vars(matches("^r[1-9]")), all_vars(is.finite(.)))
Run Code Online (Sandbox Code Playgroud)
使用@lmo的样本数据,结果是:
Run Code Online (Sandbox Code Playgroud)r1 r2 d 1 1 1 0.2774292