2017-09-04 43 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

相關問題