2017-09-04 56 views
2

我试图筛选出NANaNInf值超出使用dyplrfilter功能tbl的。过滤器变量,其列名称包含模式

诀窍是我只想将过滤器应用于名称包含特定模式的列。该模式是: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))) 

但是,此代码返回警告消息:“截断向量为1”。 并且返回的数据未经过滤。

我怀疑它是这里的is.na功能所引起的问题,因为我已经看到了一个例子在线,您可以使用正常情况下适用grepfilter(即condition == value),而不是基于is.na

条件
+1

你能提供你的数据集的[重复的例子(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? –

+0

我认为问题在于你正在为'NA','NaN'和'Inf​​'测试'colnames(DF)',它应该是那些列中的值。 (那些匹配你的模式'r [1-9]'。) –

回答

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 

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

2

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(.))) 
+0

我刚刚意识到我没有完成这个例子。现在它的完整,@ anita-mcgill – pachamaltese

4

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

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

使用@改性活生物体的样本数据,结果是:

r1 r2   d 
1 1 1 0.2774292 
+0

嗨,这工作。但是我现在发现了一个进一步的问题,只能通过过滤'Inf'和'NaN'值(并留在NA中)来解决。为了做到这一点,我可以用'all_vars(!is.infinite(。))&all_vars(!is.nan(。))'替换第二个参数' –

+0

@AnitaMcGill上面我发布了一个解决方案,指出你当前的问题 – pachamaltese