wake-up-neo.com

So erhalten Sie Basis-Frame-Frame-Namen beim Filtern in einer Dplyr-Kette

Ich habe den folgenden Datenrahmen:


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

Ich möchte Zeilen mit Werten <8 in einer der Spalten loswerden. Ich habe es versucht, aber die Zeilennamen (z. B. ATP1B1, CYCS usw.) sind weg:

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

Wie kann ich das in einer Kette bewahren?

17
scamander

sie können Zeilennamen in eine Spalte konvertieren und nach dem Filtern zurückkehren:

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
29
mt1022

dplyr kann dieses Problem auf jeden Fall lösen. Versuchen Sie es mit Base R Boolean

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

       BoneMarrow Pulmonary
ATP1B1         30      3380
PRR11        2703        27

EDIT1: Oder Sie können mit df[!rowSums(df<8),] (wie unter @ user20650) dasselbe Ergebnis erzielen.

4
Wen-Ben

Hier ist eine weitere base R-Methode mit Reduce

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

Bei Genzählungen möchten Sie häufig wissen, ob mindestens x Proben mehr als y Zählungen haben, und nicht nur für alle Proben.

Nicht so hübsch wie filter_if, aber ich bin nicht sicher, wie Sie die gleichen rowSums-Bedingungen mit all_vars implementieren würden

   x <- sample_threshold  
   y <- count_threshold

   require(dplyr) 
   require(tibble)

   df %>%  
       tibble::rownames_to_column('gene') %>%  
       dplyr::filter(rowSums(dplyr::select(., -gene) > y) > x) %>%  
       tibble::column_to_rownames('gene')
1