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的组@dlealintersect()
就是@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"))