2017-06-28 7 views
2

私は列ヘッダーの部分名と数式(x> 0)の両方を使用して行をフィルタリングする方法を見つけようとしています。私は「W」で終わる「S」で終わるのヘッダーと列と列の値> 0を持つ行のみを含める部分列名と数式に基づいてデータフレームの行をフィルタリングする

OTU_ID  X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
1 denovo109  16   0   9   0 
2 denovo147  44   484   28   0 
3 denovo297  0   0   7   14 
4 denovo1013  0   1   0   0 

:ここに私のデータを考えます。私は列ヘッダーの部分文字列と特定の列の値に基づいてフィルタする方法に基づいて列をフィルターする方法を見つけましたが、2つのセットで同時に発生する値> 0に基づいてフィルターを掛けることができる何も見つかりませんでした異なる部分文字列で指定された列。

助けていただけたら幸いです!使用

+0

行の値が何であっても、列の終わりを "W"で保持しますか? – www

+0

はい。私はW&0で終わる任意の列に値> 0を持つ行のみが必要です。 –

+0

参照してください。私は 'any_vars'に' all_vars'を置き換えることで答えを更新しました。これがあなたが望むものなら教えてください。 – www

答えて

2

cols <- grep('[SW]$', names(df), value = TRUE) 
df[rowSums(df[, cols] > 0) == length(cols),] 

ができます:

 OTU_ID X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
2 denovo147   44  484  28   0 

これはあなただけSまたはWに終了の列のゼロより上のすべての値を持つ行を維持することを前提としてい。

注:value = TRUEgrepでは省略することができ、Sに終了する列とは別のWに終了する列を扱いたい場合は、その後、あなたのコメントに戻ってRESPONSで


を数値ベクトルを与えますあなたが行うことができます:与える

wcols <- grep('W$', names(df), value = TRUE) 
scols <- grep('S$', names(df), value = TRUE) 

df[rowSums(df[, wcols, drop = FALSE] > 0) & rowSums(df[, scols, drop = FALSE] > 0),] 

 OTU_ID X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
2 denovo147   44  484  28   0 
+0

ありがとう!これは、Wで終わるすべての列とSで終わるすべての列の値が0より大きい行に対しては機能しますが、より具体的であったはずです。 W>および任意の列がSで終わる任意の列に値> 0を持つ行を保持する方法はありますか? –

+0

@EmilyDodd更新プログラムを参照してください、HTH – Jaap

+0

これは機能します!どうもありがとうございます! –

3

dplyrパッケージのfilter_atを使用できます。 dt2が最終出力です。

# Load package 
library(dplyr) 

# Create example data frame 
dt <- read.table(text = " OTU_ID  X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
1 denovo109  16   0   9   0 
       2 denovo147  44   484   28   0 
       3 denovo297  0   0   7   14 
       4 denovo1013  0   1   0   0", 
       header = TRUE, stringsAsFactors = FALSE) 

# Filter the data, with any column ends with "S" or "W" and values > 0 
dt2 <- dt %>% 
    filter_at(vars(ends_with("S")), any_vars(. > 0)) %>% 
    filter_at(vars(ends_with("W")), any_vars(. > 0)) 
関連する問題