-1

我有这个data.frame:

> d
   x  y
1  6  1
2  2 -1
3  3 -1
4  2 -1
5  3  1
6  1 -1
7  4  1
8  7 -1
9  3 -1
10 4 -1
11 8  1
12 4 -1
13 2 -1
14 9 -1
15 5  1
16 7  1
17 6 -1
18 7 -1
19 3 -1
20 2 -1

我想搜索在 column1 中具有相同值的行,并且它们在第 2 列中都没有 +1。因此,在这种情况下,例如,值 x=2 的行没有 y=1,所以我想删除它们。同样的事情也发生在 x=9 和 x=1 的行上。

换句话说,如果我们创建数据的子集,在每个子集中,所有 x 值都相同,那么任何不具有 y=1 的子集都应该被丢弃。

你有什么建议吗?如果不清楚,我会尽量详细说明!

4

4 回答 4

1

我认为这就是你想要的:

d[d$x %in% subset(aggregate(y ~ x, d, max), y == 1)$x, ]

对于每个 unique x,获取最大值:

aggregate(y ~ x, d, max)

只需返回x最大值y为 1 的那些。

subset(aggregate(y ~ x, d, max), y == 1)$x

现在拉出x该组x值中的行。

d[d$x %in% subset(aggregate(y ~ x, d, max), y == 1)$x, ]
于 2013-10-16T15:53:09.803 回答
1

这是一个简单的解决方案:

>df[with(df,x %in% unique(x[y==1])),]
   x  y
1  6  1
3  3 -1
5  3  1
7  4  1
8  7 -1
9  3 -1
10 4 -1
11 8  1
12 4 -1
15 5  1
16 7  1
17 6 -1
18 7 -1
19 3 -1

或者,等效地:df[df$x %in% unique(df$x[df$y==1]),]

于 2013-10-16T15:54:01.947 回答
0

这将是对 d$y 在 d$x==2 的任何行中包含值 1 的可能性的测试:

 any( d[d$x==2, "y"] == 1 )

如果这种可能性成立,则使用一些布尔代数和逻辑索引返回一个已删除所有 d$x==2 行的数据框:

 d[ !as.logical( d$x == 2 * any( d[d$x==2, "y"] == 1 ) ) , ]

(注意:2的值不满足你设置的窄条件。)

如果您想将该规则应用于 d$x 的所有唯一值并应用更一般的排除条件 no y > 0

 lmat <- t( sapply( unique(d$x) , function(val) 
           as.logical( d[["x"]] == val * any( d[d[["x"]]==val, "y"] > 1 ) ) ) )
 # Now use `any` to determine which rows to exclude.
# One does need to transpose that matrix of excluded logicals.
 d[ ! apply( t(lmat) , 1, any), ]
   x  y
2  2 -1
4  2 -1
6  1 -1
13 2 -1
14 9 -1
20 2 -1
于 2013-10-16T15:57:33.637 回答
0

首先找到 y==1 然后检查重复的 x 不是更简单吗?

as.data.table(d)[y==1][x %in% x[duplicated(x)]]
于 2013-10-16T16:51:43.740 回答