我正在尝试使用NA
{{1}过滤掉NaN
中的Inf
,tbl
和dyplr
值功能。
技巧是我只想将过滤器应用于名称包含特定模式的列。模式是:r1,r2,r3等。
我尝试将filter
和grep
结合起来实现这一目标,但无法让它发挥作用。我目前的代码如下:
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
答案 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(.)))