使用 %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
我正在使用 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