r data.table-排除行中包含某些值的组

r data.table-排除行中包含某些值的组,r,data.table,R,Data.table,这是一个示例数据表: set.seed(100) > A <- data.table( a = sample(c('x','c','y',''),10, replace = T), b = sample(as.Date(c('2008-12-31','2012-12-31','2013-12-31','2014-12-31','2016-12-31')),10, replace = T) , c = runif(10) ) > A a b

这是一个示例数据表:

set.seed(100)

> A <- data.table( a = sample(c('x','c','y',''),10, replace = T), b = sample(as.Date(c('2008-12-31','2012-12-31','2013-12-31','2014-12-31','2016-12-31')),10, replace = T) , c = runif(10)  )

> A
    a          b         c
 1: c 2014-12-31 0.5358112
 2: c 2016-12-31 0.7108038
 3: y 2012-12-31 0.5383487
 4: x 2012-12-31 0.7489722
 5: c 2014-12-31 0.4201015
 6: c 2014-12-31 0.1714202
 7:   2012-12-31 0.7703016
 8: c 2012-12-31 0.8819536
 9: y 2012-12-31 0.5490967
10: x 2014-12-31 0.2777238
但我相信这将删除所有包含“x”或“c”的行。我感兴趣的是只删除那些同时至少有一个X和一个C的

谢谢,

试试这个:

setkey(A, a)

A[!b %in% intersect(A['x', b], A['c', b])]

逻辑:无需按分组,只需提取包含x或y的唯一的
b
,然后删除这些条目

library(data.table)
set.seed(100)
A <- data.table( a = sample(c('x','c','y',''),10, replace = T), 
                 b = sample(as.Date(c('2008-12-31','2012-12-31','2013-12-31','2014-12-31','2016-12-31')),10, replace = T) , 
                 c = runif(10)  )

split(A, A$b)
#$`2012-12-31`
#   a          b         c
#1: y 2012-12-31 0.5383487
#2: x 2012-12-31 0.7489722
#3:   2012-12-31 0.7703016
#4: c 2012-12-31 0.8819536
#5: y 2012-12-31 0.5490967

#$`2014-12-31`
#  a          b         c
#1: c 2014-12-31 0.5358112
#2: c 2014-12-31 0.4201015
#3: c 2014-12-31 0.1714202
#4: x 2014-12-31 0.2777238

#$`2016-12-31`
#  a          b         c
#1: c 2016-12-31 0.7108038

A[!b %in% intersect(b[a == "x"], b[a == "c"])]
#  a          b         c
#1: c 2016-12-31 0.7108038

将答案更改为显示一个
dplyr
变体

A %>%
  group_by(b) %>%
  distinct(a) %>%
  filter(a %in% c("x","c")) %>%
  filter(row_number()>1) %>%
  anti_join(A, ., by="b")
按多个
b
列分组,例如
b1
b2

A %>%
  group_by(b1,b2) %>%
  distinct(a) %>%
  filter(a %in% c("x","c")) %>%
  filter(row_number()>1) %>%
  anti_join(A, ., by=c("b1","b2"))

你能给出这个例子的预期结果吗?您的子句“以及出现x和c的其他子句不重要。”如果没有它,我就不清楚。示例数据集不是唯一的,因为您忘记调用
set.seed()
。谢谢。我的意思是说“x和c的出现顺序并不重要”@joel.wilson他想排除带有
x
c
的组,希望问题现在稍微清楚一点。您的代码排除了最后一个不应该包含的组。该组有一个C,但没有X。我想排除所有至少有一个C和一个Xahh的组@dleal
intersect()
就是@siralen所做的事情。我在这里完成了我的回答,跟他一起去。用分组的方式做什么?我的实际数据有不止一个“b”列,理想情况下我会按组来做谢谢,这将删除所有带有C或X的观察值,而不是C和XX@dleal将对
dplyr
选项的回答更改为正确的
数据。表
选项已给出
A %>%
  group_by(b) %>%
  distinct(a) %>%
  filter(a %in% c("x","c")) %>%
  filter(row_number()>1) %>%
  anti_join(A, ., by="b")
A %>%
  group_by(b1,b2) %>%
  distinct(a) %>%
  filter(a %in% c("x","c")) %>%
  filter(row_number()>1) %>%
  anti_join(A, ., by=c("b1","b2"))