过滤列名称包含模式的变量

时间:2017-09-04 16:08:33

标签: r filter grep dplyr tidyverse

我正在尝试使用NA {{1}过滤掉NaN中的Inftbldyplr值功能。

技巧是我只想将过滤器应用于名称包含特定模式的列。模式是:r1,r2,r3等。

我尝试将filtergrep结合起来实现这一目标,但无法让它发挥作用。我目前的代码如下:

filter

但是,此代码会返回一条警告消息:"将向量截断为长度为1。" 返回的数据未经过滤。

我怀疑这里导致问题的是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))) 功能,因为我在网上看到了一个示例,您可以将is.na应用于grep使用正常条件(即filter)而不是基于condition == value

的条件

3 个答案:

答案 0 :(得分:4)

这是一个过滤行的基本R方法,比较特定的列。

# sample data
set.seed(1234)
dat <- data.frame(r1=c(NA, 1,NaN, 5, Inf), r2=c(NA, 1,NaN, NA, Inf), d=rnorm(5))

此数据集看起来像

dat
   r1  r2          d
1  NA  NA -1.2070657
2   1   1  0.2774292
3 NaN NaN  1.0844412
4   5  NA -2.3456977
5 Inf Inf  0.4291247

我们将检查前两列并忽略第三列。请注意,唯一应保留的行是第2行。

dat[Reduce("&", lapply(dat[grep("^r", names(dat))], is.finite)),]
  r1 r2         d
2  1  1 0.2774292

此处,使用grep选择适当列(1和2)的子集的data.frame被馈送到lapply。正则表达式“^ r”表示只包含名称以“r”开头的变量。在lapply循环中,使用is.finite检查每个向量。对于NA,NaN和Inf,此函数返回FALSE。得到的逻辑向量列表被送到Reduce`,它返回一个逻辑向量,data.frame的行数的长度,当一个元素为TRUE时,当且仅当行中的每个元素都是有限的时。

答案 1 :(得分:4)

使用dplyr,您可以使用filter_at功能:

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

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

  r1 r2         d
1  1  1 0.2774292

答案 2 :(得分:3)

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"))

示例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(.)))