2016-12-10 46 views
0

過濾柱範圍內我有類似下面的一個數據幀(有更多的字符串列,我只包括一個)如何R中

phy chem lang math name 
1 17 17 69 8 a 
2 86 58 93 37 b 
3 70 27 12 18 c 
4 74 23 13 52 d 
5 15 67 66 49 e 
6 35 98 41 90 f 
7 64 77 79 33 g 
8 49 9 91 44 h 
9 33 76 7 100 i 
10 22 39 42 79 j 
11 6 69 64 36 k 
12 91 59 8 66 l 
13 79 40 88 16 m 
14 71 55 23 40 n 
15 65 1 5 67 o 
16 14 19 59 6 p 
17 11 60 67 69 q 
18 81 18 30 25 r 
19 36 96 31 30 s 
20 38 25 24 26 t 

我試圖保持行時(ALL)數值範圍在(50,100)中來自phy的列:僅數學。我試圖使用dplyr,但我得到的只是第一列過濾,即我得到的值在下列小於50.

這裏是一個代碼,您可以重現數據,我正在使用的過濾器。 '

phy<-sample(100,20) 
chem<-sample(100,20) 
lang<-sample(100,20) 
math<-sample(100,20) 
name<-letters[1:20] 
df<-data.frame(phy,chem,lang,math,name) 
subset(df,(df[,1:4]>50 | df[,1:4]<=100)) 

我已經

filter(df, phys>=50 ,chem>=50 , math>=50,lang>=50) 

用於組合濾波器的方法,然後添加其他條件,但我知道必須有一個簡單的解決這一點。

注意:我已經在網站上搜索並在搜索一天後發佈了問題。

感謝

回答

2

試試這個:

df[apply(df[,1:4], 1, function(x) all(x > 50) & all(x < 100)),] 
+0

工作!謝謝 – Athii

1

你可以通過每一行,如果找到最小/最大秋天的標準範圍內,並返回TRUE/FALSE。

ss <- apply(df[, 1:4], MARGIN = 1, FUN = function(x) { 
    rg <- range(x, na.rm = TRUE) 
    if (min(rg) > 50 & max(rg) <= 100) TRUE else FALSE 
    }) 

df[ss, ] 

    phy chem lang math name 
11 51 66 76 59 k 
20 99 92 75 100 t 
+0

謝謝了,當我將它應用於完整的數據框時,我得到了'缺少TRUE/FALSE所需的值',你認爲這可能是由於空單元? – Athii

+0

@Athii我在'range()'中添加了'na.rm'參數來解決NA問題。 –

+0

現在感謝它的工作 – Athii

1

我們創建邏輯矩陣,否定(!),請使用rowSums以獲取每一行真值的計數,轉換爲邏輯向量(!),其中0值是TRUE(即所有值都內範圍)和其他FALSE,並將數據集分組。

df[!rowSums(!(df[1:4]>50 & df[1:4] <= 100), na.rm = TRUE),] 
# phy chem lang math name 
#11 51 66 76 59 k 
#20 99 92 75 100 t 

或與另一個有效的方法是通過各列環,通過比較每個vector&)的對應元件得到邏輯vector s的listReduce它到單個vector,使用於子集的數據集。

df[Reduce(`&`, lapply(df[1:4], function(x) x > 50 & x <= 100)),] 
# phy chem lang math name 
#11 51 66 76 59 k 
#20 99 92 75 100 t 

注:作爲第一個到列而不是行使用矢量rowSums環和第二環這兩種方法都應該是非常有效的。

+0

他們都在完整的數據集上很好地工作。非常感謝你 – Athii

+0

不幸的是,它沒有考慮潛在的NAs(Na行被添加到結果中)。 –

+0

@Athi很高興知道它的工作原理。有'na.rm = TRUE'來照顧NAs。 – akrun