我有这个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的子集都应该被丢弃。
你有什么建议吗?如果不清楚,我会尽力详细说明!
答案 0 :(得分:1)
我认为这就是你想要的:
d[d$x %in% subset(aggregate(y ~ x, d, max), y == 1)$x, ]
对于每个唯一x
,请获取最大值:
aggregate(y ~ x, d, max)
只需返回x
的最大值为{1}}的{{1}}。
y
现在拉出subset(aggregate(y ~ x, d, max), y == 1)$x
在x
组值中的行。
x
答案 1 :(得分: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]),]
答案 2 :(得分: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的所有唯一值,并应用更通用的排除条件,即无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
答案 3 :(得分:0)
首先找到y == 1然后检查重复的x会不会更简单?
as.data.table(d)[y==1][x %in% x[duplicated(x)]]