【问题标题】:How to include decimal numbers in ":" sequence如何在“:”序列中包含十进制数字
【发布时间】: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 &gt;= 0 &amp; vec &lt; 2)] 怎么样?
  • 同样,setdiff(vec, vec[vec&gt;=0 &amp; vec&lt;2])
  • 我有时使用`%btwn%` &lt;- function(a, b) a &gt;= min(b) &amp; a &lt;= 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。如果要测试某个范围内的包含,请使用&gt;&lt; 等。
  • 修改我的第一条评论(来不及编辑)。在您的情况下,它将是 vec[! vec %btwn% c(1.2, 5.4)]

标签: r sequence


【解决方案1】:

这是使用findInterval 的另一种方法。我发现该函数在避免复杂的嵌套 ifelse 构造方面很方便。在这种情况下,它看起来确实比评论建议使用 vec[!(vec &gt;= 0 &amp; vec &lt; 2)].findInterval 更好,只要它的第一个输入返回一个数字向量,并且可以用于索引:

vec <- c(-1, 0, 0.5, 0.9, 1, 1.2, 1.3, 5, 5.4, 6, 7, 9)
vec [ findInterval(vec, c(0,2)) != 1]
#[1] -1.0  5.0  5.4  6.0  7.0  9.0

不能使用:,因为它只支持整数。

【讨论】:

    【解决方案2】:

    使用dplyr包的between函数的另一种方法

    vec[!dplyr::between(vec,0,2)]
    #[1] -1.0  5.0  5.4  6.0  7.0  9.0
    vec[!dplyr::between(vec,1.2,5.4)]
    #[1] -1.0  0.0  0.5  0.9  1.0  6.0  7.0  9.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 2014-10-07
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2012-09-26
      相关资源
      最近更新 更多