仅从矢量中选择整数

时间:2015-05-27 08:09:38

标签: r

我有一个关于从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

我得到了预期的结果(我可以使用这个向量来对我的数据集进行子集化)。但是,是否有更直接的方法来选择整数值?

2 个答案:

答案 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