【问题标题】:R Wrong logical subsetting for a vectorR 向量的逻辑子集错误
【发布时间】:2021-06-16 05:06:45
【问题描述】:

我有两个逻辑向量。

a <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
b <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

当我尝试将 b 子集化为 a 时

b[which(a == 1)]

一切都如我所料。但是,像这样

b[a]

我得到不同的结果。

为什么?可能解释很明显,但我完全不明白......

【问题讨论】:

  • 你没有逻辑向量。它们显然是数字。
  • @Roland 好的。你有我的问题的答案吗?
  • 是的,但是 Henrik 已经告诉过您在哪里可以找到答案。他的建议很好。每个 R 用户都应该研究过该文档并定期重读。我这样做了。

标签: r vector subset


【解决方案1】:

a 是一个二进制向量。可以使用 as.logical 将其转换为布尔值,然后它将按预期工作,即它将获取 'b' 中与 'a' 中的 TRUE 值相对应的元素

b[as.logical(a)]

因为 0 被认为是 FALSE,而所有其他值都可以是 TRUE

as.logical(c(1, 0, 2, 3))
#[1]  TRUE FALSE  TRUE  TRUE

否则,索引从R从1开始,1的值是根据位置选择第一个元素,其中which(a == 1)从逻辑向量中获取序列的位置


b[c(1, 1, 0, 1)]

选择 'b' 的第一个元素 3 次

b[which(c(1, 1, 0, 1) == 1)]

获取位置为 1, 2, 4 用于选择 'b'

which(c(1, 1, 0, 1) == 1)
#[1] 1 2 4

【讨论】:

  • 感谢您如此详细的回答!我仍然有点困惑,但我会重新阅读,做一些实验,希望能理解!
  • @AnnaPlaxienko 一旦你转换为逻辑== 1,就不需要which(假设没有NAs)因为它只选择对应于TRUE的元素,即...... 1 存在。因为索引也适用于数值 1,所以 0 被视为整数/数字。因此,对于存在 1 的位置,位置始终为 1,而 0 被删除,因为 R 中没有 0 索引
  • @AnnaPlaxienko 请让我知道混淆部分。我会试着举一些例子,这样你就清楚了。谢谢
【解决方案2】:

正如@akrun 所解释的,您需要基于a 子集b 的逻辑值。

下面是将数字 a 转换为逻辑值的另一种选项,例如,

> b[!!a]
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
[39] 1 0 0 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多