R:提取一列(x)的值,其在数据帧中的另一列(y)中具有至少一个+1

时间:2013-10-16 15:42:15

标签: r remove-if

我有这个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 个答案:

答案 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)]]