2015-06-30 33 views
1

我試圖找出一種方法來根據R中的每個因子找到特定值。換句話說,我如何保留所有滿足每個因子的特定條件的行,即使該特定行失敗了一個條件,但它是相同的因素通過另一行上的條件?R - 根據組因子查找行

所以我有這樣的事情:

gender values fruit 
1  M  20 apple 
2  M  22 pear 
3  F  24 mango 
4  F  19 mango 
5  F  9 mango 
6  F  17 apple 
7  M  18 banana 
8  M  22 banana 
9  M  12 banana 
10  M  14 mango 
11  F  7 apple 
12  F  8 apple 

我想每一個水果和具有至少一個F性別(即使是水果有一些男款)。也可以有多個性別,例如中性(未顯示)。所以,我的理想輸出出來是這樣的:

gender values fruit 
1  M  20 apple 
3  F  24 mango 
4  F  19 mango 
5  F  9 mango 
6  F  17 apple 
10  M  14 mango 
11  F  7 apple 
12  F  8 apple 

注意,香蕉和梨缺失,這是因爲這些水果只有M的和沒有F的。此外,第1行和第10行仍然存在,即使這些是M的,因爲還有其他蘋果和芒果有F,它仍然適用。請讓我知道這是否可能。謝謝!

下面是我複製此數據代碼:

gender <- c("M","M","F","F","F","F","M","M","M","M","F","F") 
values <- c(20,22,24,19,9,17,18,22,12,14,7,8) 
fruit <- c("apple","pear","mango","mango","mango","apple","banana","banana","banana","mango","apple","apple") 
df <- data.frame(gender, values, fruit) 

這裏是我試過到目前爲止:

df[duplicated(df[,c("fruit","gender")]),] 
ave(df$gender, df$fruit, FUN=function(x) ifelse(x=='F','yes','no')) 

此外,第三方庫的歡迎,但我更喜歡呆在R內部(包的統計數據和plyr都很好,因爲我在我的系統上有這些數據)。

+0

不......這不是家庭作業,如果你有鏈接,請提供它。如果結果相同,我會刪除這個.. –

+1

句子「我想每一個水果,只有F性別」(我強調)不幸的是有些不清楚。從你想要的輸出中,你似乎想要每個水果有_any_(即至少一個)行,其中'性別=='F「'。 – Henrik

+0

是的,對不起。你是對的 –

回答

3
df[df$fruit %in% unique(df[df$gender =='F', ]$fruit),] 
# gender values fruit 
#1  M  20 apple 
#3  F  24 mango 
#4  F  19 mango 
#5  F  9 mango 
#6  F  17 apple 
#10  M  14 mango 
#11  F  7 apple 
#12  F  8 apple 
+1

我喜歡。應該非常高效。 –

+0

謝謝!這很有用,對向我展示我在R中不知道的其他功能非常有幫助。 –

+0

不客氣。爲了清晰起見,分別運行代碼的每個部分:) –

3

可能data.table方法

library(data.table) 
setDT(df)[, if(any(gender == "F")) .SD, by = fruit] 
# fruit gender values 
# 1: apple  M  20 
# 2: apple  F  17 
# 3: apple  F  7 
# 4: apple  F  8 
# 5: mango  F  24 
# 6: mango  F  19 
# 7: mango  F  9 
# 8: mango  M  14 

我喜歡的另一種方法,所以這裏是一個data.table相當於使用二進制加入

setkey(setDT(df), fruit)[.(unique(df[gender == "F", fruit], by = "fruit"))] 
# gender values fruit 
# 1:  F  17 apple 
# 2:  F  7 apple 
# 3:  F  8 apple 
# 4:  M  20 apple 
# 5:  F  24 mango 
# 6:  F  19 mango 
# 7:  F  9 mango 
# 8:  M  14 mango 
+1

謝謝。 'data.table'方法對於它們的速度和靈活性來說總是很棒的。 –

+1

謝謝!很有幫助。 –

1

鹼基r,則data.table這裏我提供dplyr解決方案,即使有些輸出是不同的(至少按照結果的順序)。

library(dplyr) 
df %>% group_by(fruit) %>% filter(any(gender == "F")) 
Source: local data frame [8 x 3] 
Groups: fruit 

    gender values fruit 
1  M  20 apple 
2  F  24 mango 
3  F  19 mango 
4  F  9 mango 
5  F  17 apple 
6  M  14 mango 
7  F  7 apple 
8  F  8 apple 
+1

感謝您的dplyr比較。對未來的觀衆非常有用。 –