【问题标题】:Logical manipulation of lists in RR中列表的逻辑操作
【发布时间】:2015-09-23 15:04:26
【问题描述】:

我有一些R,例如:

x<-c(-3,1,-5,7,-10)
y<-c(1,2,3,4,5)

我想根据某些条件检查 x 的元素,即

例如,如果我的逻辑检查是 x

print(y)
y=[0,2,0,3,0]

我用谷歌搜索了一下,但找不到任何元素方面的东西。我确信这是 google-fu 的失败,但非常感谢您的帮助。

【问题讨论】:

  • 在R中,索引从1开始。你可以试试y[x &lt; 0] &lt;- 0。您想要的输出似乎也关闭了。你在找y=[0,2,0,4,0]吗?
  • 我认为有一个错误。预期的输出应该是0 2 0 4 0
  • 对不起,是的,我的意思是元素 1 3 和 5,如果 R 从 1 开始计数。
  • 您建议的方法在上面的测试用例中效果很好,但在我的脚本中似乎不起作用。将进一步调查,一定是我搞砸了。
  • 我发现了问题。我在逻辑上检查它是否

标签: r


【解决方案1】:
y[x < 0] <- 0
y
#[1] 0 2 0 4 0

索引从 R 中的 1 开始。我们可以通过 x &lt; 0 的逻辑索引对 y 进行子集化。 R 的一个优势是能够按名称、布尔值和数字进行子集化。

这两个函数返回相同的输出y[c(TRUE, FALSE, TRUE, FALSE, TRUE)]y[c(1,3,5)]。该函数尝试确定您正在执行哪种类型的子集。

在本例中不能使用子集的第三种情况,因为y 没有名称。但是如果我们命名向量,我们也可以这样子集。

names(y) <- c("A", "B", "C", "D", "E")
y[c("A", "C", "E")]

您似乎也被空格和赋值运算符减慢了速度。它是 R 独有的,但 &lt;- 类似于 =

x<-5

在这种情况下,&lt;- 按操作顺序获得优先级,等效于x = 5,而不是x &lt; -5

【讨论】:

  • 谢谢,我搞定了。我在逻辑上检查 -5,即 y[x
  • 是的。括号解决了这个问题。
【解决方案2】:

例如,这会将这些值加 1。

y[x < 0] <- y[x < 0] + 1

假设你想保留所有的 Y 元素:

y <- ifelse(x < 0, 0, y)

【讨论】:

  • 我的回答与@Pierre Lafortune 非常相似,尤其是他的回答要优雅得多。有很多方法可以在 R 中完成工作!享受吧!
  • 谢谢,我搞定了。我在逻辑上检查 -5,即 y[x
【解决方案3】:

由于布尔变量的实现方式,您可以在算术中使用它们,就好像它们是 0 或 1,因此对于您的示例,您可以使用:

y*(x>=0)
[1] 0 2 0 4 0

对于更通用的方法,replace 函数存在:

replace(y,x<0,0)
[1] 0 2 0 4 0

【讨论】:

  • 第一个的优点是没有复制。而且我想它也更快。
  • @RichardScriven 如果你想获得关于它的所有基准,这个操作通过引用替换:library(data.table); setDT(list(y))[x&lt;0, V1 := 0](据我所知,在之前和之后查看address)。摘自 eddi 的回答:stackoverflow.com/questions/30344192/…
  • 不太在意。但我确实喜欢这个第一个答案。随着所有代码高尔夫在这里进行,我认为这会获得更多选票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多