我正在使用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岁,对同一个人来说是不可能的。
答案 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