【发布时间】:2016-09-19 14:47:17
【问题描述】:
我有一系列数字,包括整数和小数。 当我尝试使用一系列数字对该列表进行子集化时,它会在子集化时忽略小数。 如何让子集范围包含小数?
注意:我知道 seq 可用于创建具有不同小数的序列(例如,see here),但如果我想使用数据中的 实际 值来创建而不是新创建的序列?
这可能吗?
例如:
vec <- c(-1, 0, 0.5, 0.9, 1, 1.2, 1.3, 5, 5.4, 6, 7, 9)
vec[!(vec %in% 0:2)]
[1] -1.0 0.5 0.9 1.2 1.3 5.0 5.4 6.0 7.0 9.0
#But what I want is:
[1] -1.0 5.0 5.4 6.0 7.0 9.0
和
vec[!(vec %in% 1.2:5.4)]
[1] -1.0 0.0 0.5 0.9 1.0 1.3 5.0 5.4 6.0 7.0 9.0
#But what I want is:
[1] -1.0 0.0 0.5 0.9 1.0 6.0 7.0 9.0
【问题讨论】:
-
vec[!(vec >= 0 & vec < 2)]怎么样? -
同样,
setdiff(vec, vec[vec>=0 & vec<2]) -
我有时使用
`%btwn%` <- function(a, b) a >= min(b) & a <= max(b),在这种情况下是vec %btwn% 0:2 -
一般来说,将
%in%与小数一起使用是一个糟糕的主意,因为它正在测试浮点数的相等性。您将很快遇到浮点精度问题,您的下一个问题将与Why are these numbers not equal r-faq 重复。例如,注意seq(0, 1, 0.1) %in% seq(0, 1, 0.01)中的FALSEs。如果要测试某个范围内的包含,请使用>、<等。 -
修改我的第一条评论(来不及编辑)。在您的情况下,它将是
vec[! vec %btwn% c(1.2, 5.4)]