2017-04-11 82 views
0

說我有一個數據幀子集基於具有兩個屬性的列的數據幀

ds <- read.table(header = TRUE, text =" 
       g1 color 
       A red 
       A yellow 
       B red 
       C red 
       C yellow 
       ") 

所以我想子集的新數據框中只包含在G1組什麼同時具有「紅色」和「黃色」列顏色。使用上面示例的新表格不會包含任何包含B的行。我不確定如何處理此問題,因爲使用紅色或黃色的子設置仍將包含僅具有紅色的「B」。

ds[ds$color=="red" | ds$color=="yellow", ] 

謝謝。

+0

你的例子不是'data.table'。你正在用'data.frame'還是'data.table'尋找解決方案? – jogo

+0

我不明白你在找什麼。也許你可以給出所需的輸出? – Puddlebunk

+1

@Puddlebunk OP說組B將根據他們的標準被排除;除了刪除這些行之外,我猜,表格將是相同的。 – Frank

回答

1

你可以這樣做:

ds$col.count <- ave(as.integer(ds$color), ds$g1, FUN=function(x) length(unique(x))) 
ds[ds$col.count==2,] 

短的變體是:

ds[as.logical(ave(as.integer(ds$color), ds$g1, FUN=function(x) 2==length(unique(x)))), ] 

需要的as.integer()因爲數字矢量ave()作品,需要的as.logical()因爲ave()結果是數字矢量。

這裏是data.table一個解決方案:

library(data.table) 
ds <- fread(header = TRUE, 
"g1 color 
A red 
A yellow 
B red 
C red 
C yellow") 
ds[, col.count:=length(unique(color)), by=g1][col.count==2] 

如果很顯然,每一個組中的每個顏色不能兩次,然後你可以簡單地做:

ds[, col.count := .N, by = g1][col.count == 2] 
+0

Franks對該問題的評論解答非常好! – jogo

+0

希望您不介意我已編輯您的答案 – Uwe

+0

@UweBlock不一樣,例如如果有一個額外的行'紅色'。只有在每個組中每種顏色都不能兩次的情況下才是一樣的。 – jogo

0

這是一個漫長的用鹼基R法ave

ds[as.logical(ave(as.character(ds$color), ds$g1, 
        FUN=function(i) "red" %in% i & "yellow" %in% i)), ] 
    g1 color 
1 A red 
2 A yellow 
4 C red 
5 C yellow 
2

dplyr y您可以同時使用一個簡單的group_by()filter()

ds %>% group_by(g1) %>% filter(all(c("red","yellow") %in% color)) 

這將允許任意數量的要匹配的值。