在R中,负子集产生了意外的结果,其数值稍大
在R中在R中,负子集产生了意外的结果,其数值稍大,r,subset,R,Subset,在R中 打印((1:20)[-(15:18)]) 按预期打印从1到20(15到18除外)的整数列表 但是 print((1983:2010)[-(1992:1994)]) 打印1983年至2010年(包括1992年至1994年)的整数列表。负子集不起作用 这是怎么回事?我知道R可能会遇到非常大的数字,但我不认为这些数字非常大。 < P>这是基于数值索引的。在第二个例子中,我们没有长度大于1994的向量,但在前一个例子中,有 length(1983:2010) #[1] 28 处理此问题的方法是
打印((1:20)[-(15:18)])
按预期打印从1到20(15到18除外)的整数列表
但是
print((1983:2010)[-(1992:1994)])
打印1983年至2010年(包括1992年至1994年)的整数列表。负子集不起作用
这是怎么回事?我知道R可能会遇到非常大的数字,但我不认为这些数字非常大。 < P>这是基于数值索引的。在第二个例子中,我们没有长度大于1994的向量,但在前一个例子中,有
length(1983:2010)
#[1] 28
处理此问题的方法是在%
v1 <- 1983:2010
v1[!v1 %in% 1992:1994]
方括号中的值指的是数字在向量中的位置,而不是数字本身 在第一个示例中,数字15-18也占据位置15-18 在第二个例子中,数字1992-1994并不占据位置1992-1994。他们占据第10-12位。因此,您可以使用:
print((1983:2010)[-(10:12)])
知道了。有没有一个不需要计算索引的简单修复方法?您可以执行
打印((1983:2010)[!1983:2010%in%1992:1994])
。谢谢。我不想计算他们将占据的位置。有没有一种方法可以在一行中完成?还是必须先命名列表,然后命名子集?@丢失了我发布的两个解决方案都是一行。我不知道你说的一行是什么意思。如果v1,我想我指的是一条语句中的一行?不确定这是不是正确的命名法。我想的是neilfws在评论中所说的话并不是有意冒犯。功能上基本相同,但您认为打印((1983:2010)[!1983:2010%in%1992:1994])
在风格上更可取吗?因为您不必命名变量,也不必将其存储在内存中,等等。这很好。在本例中,向量很小,但我可以理解为什么通常创建对象更有意义。谢谢你的帮助!
print((1983:2010)[-(10:12)])