2017-04-11 77 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)) 

这将允许任意数量的要匹配的值。

相关问题