2017-08-01 26 views
8

,我有以下的數據幀:如何在在dplyr鏈過濾保存基本數據幀rownames


df <- structure(list(BoneMarrow = c(30, 0, 0, 31138, 2703), Pulmonary = c(3380, 
21223.3333333333, 0, 0, 27)), row.names = c("ATP1B1", "CYCS", 
"DDX5", "GNB2L1", "PRR11"), class = "data.frame", .Names = c("BoneMarrow", 
"Pulmonary")) 

df 
#>  BoneMarrow Pulmonary 
#> ATP1B1   30 3380.00 
#> CYCS   0 21223.33 
#> DDX5   0  0.00 
#> GNB2L1  31138  0.00 
#> PRR11  2703  27.00 

我想要做的是讓與值< 8擺脫行在任何一列中。我試過,但該行的名稱(例如ATP1B1,CYCS等)都不見了:

> df %>% filter(!apply(., 1, function(row) any(row <= 8))) 
    BoneMarrow Pulmonary 
1   30  3380 
2  2703  27 

我怎麼能保持在dplyr鏈?

回答

14

可以rownames轉換爲列和過濾後的恢復:

library(dplyr) 
library(tibble) # for `rownames_to_column` and `column_to_rownames` 

df %>% 
    rownames_to_column('gene') %>% 
    filter_if(is.numeric, all_vars(. >= 8)) %>% 
    column_to_rownames('gene') 

#  BoneMarrow Pulmonary 
# ATP1B1   30  3380 
# PRR11  2703  27 
5

dplyr絕對可以解決這個問題,怎麼樣利用基礎R布爾

df[rowSums(df>8)==dim(df)[2],] 

     BoneMarrow Pulmonary 
ATP1B1   30  3380 
PRR11  2703  27 

EDIT1試試這個:或者你可以做df[!rowSums(df<8),](根據@ user20650)會給你相同的結果。

+0

不錯,簡潔的答案。 'df [!rowSums(df <8),]'也會這樣做 – user20650

+0

@ user20650你的答案比較好〜 – Wen

3

這裏是另一個base RReduce

df[Reduce(`&`, lapply(df, `>=`, 8)),] 
#  BoneMarrow Pulmonary 
#ATP1B1   30  3380 
#PRR11  2703  27