我有一个关于从R中的向量中选择特定值的问题。更具体地说,我想从我的数据集中的给定变量中选择所有整数值(我想使用这些值来对我的数据进行子集化)。这是一个例子:
nth_value_plot = [[0, 5], [1, 10]]
现在我想用整数来选择向量x中的所有观测值。我的第一个想法是使用x <- seq(0,10,1/3)
命令,但这不起作用。我找到了一个使用以下方法的解决方案:
is.integer
现在我只需输入
即可> x==as.integer(x)
[1] TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
FALSE TRUE FALSE FALSE TRUE
[17] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
FALSE TRUE FALSE FALSE TRUE
我得到了预期的结果(我可以使用这个向量来对我的数据集进行子集化)。但是,是否有更直接的方法来选择整数值?
答案 0 :(得分:8)
这是使用模运算符的建议的反例:
> x <- seq(1/3, 9 , 1/3)
> x[!x%%1]
[1] 1 3 4 9
> x
[1] 0.3333333 0.6666667 1.0000000 1.3333333 1.6666667 2.0000000
[7] 2.3333333 2.6666667 3.0000000 3.3333333 3.6666667 4.0000000
[13] 4.3333333 4.6666667 5.0000000 5.3333333 5.6666667 6.0000000
[19] 6.3333333 6.6666667 7.0000000 7.3333333 7.6666667 8.0000000
[25] 8.3333333 8.6666667 9.0000000
关于为什么不做出这样的假设,类似问题有许多例子,即整数将可靠地由数值的典型运算产生。规范警告是R-FAQ 7.31。在我的设备上,可以在R帮助页面中找到它:7.31 Why doesn't R think these numbers are equal?
。更可靠的方法是:
> x[ abs(x-round(x) ) < 0.00000001 ]
[1] 1 2 3 4 5 6 7 8 9
答案 1 :(得分:3)
虽然你的解决方案已经很好了,但这是另一种方法,总结了你问题中出现的所有评论:
x <- seq(0, 10, 1/3)
# selecting elements of x for which the rest of the eucliean division (by 1) is not 0
x[!x%%1]
#[1] 0 1 2 3 4 5 6 7 8 9 10
注意:由于存储浮点数的方式,这个答案(以及您的解决方案)有时可能会失败,请参阅@BondedDust的回答
为了确保一切顺利,我们需要添加一个&#34;容差部分&#34;答案,这导致更复杂但总是准确的答案:
tol <- 1e-12
x[sapply(x, function(y) min(abs(c(y%%1, y%%1-1))) < tol)]
使用BondedDust示例
x <- seq(1/3, 9 , 1/3)
x[sapply(x, function(y) min(abs(c(y%%1, y%%1-1))) < tol)]
[1] 1 2 3 4 5 6 7 8 9