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

Condition for subsetting data in R using %in%

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

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

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

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

> 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),但我不确定如何构造它以暗示它是 "row-wise" 而不是所有行的一个向量。

非常感谢您的想法!


*x11是时间点x21个体的年龄,x12是时间点x22个体(可能不同)的年龄。我想要包含 x21 处的年龄 (x11) 在逻辑上和物理上与 x22 处的年龄 (x12) 兼容的行的子集;一个在 2000 年 19 岁的人在 2001 年是 19、20 或 21 岁,这取决于生日(但由于其他原因,我在这里排除了个人同龄的可能性)。因此,第一行,2000 年 19 岁,2004 年 32 岁,不可能是同一个人。

首先,注意浮点精度限制。如果您的值都是整数,这无关紧要,但在一般情况下 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

试试这个:

#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