使用%in%对R中的数据进行子集化的条件

时间:2015-03-31 11:24:00

标签: r dataframe subset

我正在使用subset()进行一些子集化,但是在我的逻辑语句中使用%in%命令时遇到了一些问题。

考虑一个简单的数据结构,如

  x11  x21 x12  x22
1  19 2000  32 2004
2  19 2000  20 2001

我想要一个子集,其中x12等于x22-x21+x11或等于x22-x21+x11+1。*对于上面的示例,我想要第二行,因为逻辑当且仅当TRUE为20或21且满足时,语句应评估为x12。对于这个简单的设置,以下内容适用于我:

> test1 <- data.frame(x11=c(19, 19), x21=c(2000, 2000), x12=c(32, 20), x22=c(2004, 2001))
> subset(test1, (x12 %in% c(x22-x21+x11, x22-x21+x11+1)))
  x11  x21 x12  x22
2  19 2000  20 2001

当我引入其他行时出现问题。只添加一行:

  x11  x21 x12  x22
1  19 2000  32 2004
2  19 2000  20 2001
3  30 1998  32 2000

现在,我想将其子集化,以便得到第二行和第三行。但是使用与上面相同的子集策略:

> test2 <- data.frame(x11=c(19, 19, 30), x21=c(2000, 2000, 1998), x12=c(32, 20, 32), x22=c(2004, 2001, 2000))
> subset(test2, (x12 %in% c(x22-x21+x11, x22-x21+x11+1)))
  x11  x21 x12  x22
1  19 2000  32 2004
2  19 2000  20 2001
3  30 1998  32 2000

所以现在我得到了第一个例子中没有得到的行。我的猜测是它与x12被允许进入的向量相关,即c(x22-x21+x11, x22-x21+x11+1),但我不确定如何构造它以使其隐含为&# 34;逐行&#34;而不是所有行的一个向量。

非常感谢您的想法!


* x11是时间点x21处的个体的年龄,x12是时间点x22处的(可能不同的)个体的年龄。我想要包含行的子集,其中x21处的年龄(x11)在逻辑上和物理上与x22处的年龄(x12)兼容;根据生日情况,2000年19岁的个人在19岁时是19岁,20岁或21岁(但由于其他原因,我放弃了个人年龄相同的可能性)。因此,第一行,我们在2000年年龄为19岁,在2004年年龄为32岁,对同一个人来说是不可能的。

2 个答案:

答案 0 :(得分:2)

首先,要注意浮点精度限制。如果您的值都是整数,则无关紧要,但在一般情况下x==y可能会失败,除非您使用all.equal之类的工具。
现在,只需编写一个条件:

,而不是与subset%in%混淆
foo <- test1[(test1[,3]==(test1[,1]-test1[,2]+test1[,4])) |
               (test1[,3]==(test1[,1]-test1[,2]+test1[,4]+1)), ]

您可能需要逐行运行apply

答案 1 :(得分:1)

试试这个:

#data
test2 <- data.frame(x11=c(19, 19, 30),
                    x21=c(2000, 2000, 1998),
                    x12=c(32, 20, 32),
                    x22=c(2004, 2001, 2000))
#range pre-computed
test2$in1 <- test2$x22-test2$x21+test2$x11
test2$in2 <- test2$x22-test2$x21+test2$x11+1

#subset
test2[ test2$x12 >= test2$in1 &
         test2$x12 <= test2$in2,]
#   x11  x21 x12  x22 in1 in2
# 2  19 2000  20 2001  20  21
# 3  30 1998  32 2000  32  33