2013-10-16 111 views
-1

我有此data.frame:R:一列(x)中具有在數據幀的另一列(y)的至少一個1的提取物值

> d 
    x y 
1 6 1 
2 2 -1 
3 3 -1 
4 2 -1 
5 3 1 
6 1 -1 
7 4 1 
8 7 -1 
9 3 -1 
10 4 -1 
11 8 1 
12 4 -1 
13 2 -1 
14 9 -1 
15 5 1 
16 7 1 
17 6 -1 
18 7 -1 
19 3 -1 
20 2 -1 

我要搜索的行在列1中具有相同的值,並且它們中的任何一個在列2中都沒有+1。因此,在這種情況下,例如,具有值x = 2的行沒有y = 1,所以我想要刪除它們。對於x = 9和x = 1的行也會發生同樣的情況。換言之,如果我們創建了每個子集中所有x值相同的數據的子集,那麼應該丟棄任何沒有y = 1的子集。

你有什麼建議嗎?如果不清楚,我會盡力詳細說明!

+0

你能告訴我們你試過的東西嗎? [「詢問代碼的問題必須包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果。」](http://stackoverflow.com/help/on-topic) – Henrik

+1

向我們提供我們可以使用的數據,我們可以告訴你,你只需要按x值分組,這是'data.table'或'plyr'的工作 – statquant

回答

1

我想這是你想要的東西:

d[d$x %in% subset(aggregate(y ~ x, d, max), y == 1)$x, ] 

對於每一個獨特的x,得到最大的價值:

aggregate(y ~ x, d, max) 

只返回那些x爲其中y最大值是一個。

subset(aggregate(y ~ x, d, max), y == 1)$x 

現在拔出行,其中x是該組x值英寸

d[d$x %in% subset(aggregate(y ~ x, d, max), y == 1)$x, ] 
1

這裏有一個簡單的解決方案:

>df[with(df,x %in% unique(x[y==1])),] 
    x y 
1 6 1 
3 3 -1 
5 3 1 
7 4 1 
8 7 -1 
9 3 -1 
10 4 -1 
11 8 1 
12 4 -1 
15 5 1 
16 7 1 
17 6 -1 
18 7 -1 
19 3 -1 

,或等效:df[df$x %in% unique(df$x[df$y==1]),]

0

這將是不測的測試d $ y保存任何的值1行,其中d $ x == 2:

any(d[d$x==2, "y"] == 1) 

如果該事件成立,則返回一個數據幀刪除所有使用一些布爾代數和邏輯索引d $ X == 2行:

d[ !as.logical(d$x == 2 * any(d[d$x==2, "y"] == 1)) , ] 

(注:2的值沒有達到您設定的狹窄狀態。)

如果你想將該規則應用於d $ x的所有獨特價值和應用沒有y的更一般的排除條件> 0

lmat <- t(sapply(unique(d$x) , function(val) 
      as.logical(d[["x"]] == val * any(d[d[["x"]]==val, "y"] > 1)))) 
# Now use `any` to determine which rows to exclude. 
# One does need to transpose that matrix of excluded logicals. 
d[ ! apply(t(lmat) , 1, any), ] 
    x y 
2 2 -1 
4 2 -1 
6 1 -1 
13 2 -1 
14 9 -1 
20 2 -1 
0

那豈不是更簡單的先找到Ÿ== 1然後檢查重複的X?

as.data.table(d)[y==1][x %in% x[duplicated(x)]] 
相關問題