【问题标题】:logical vector subsetting in RR中的逻辑向量子集
【发布时间】:2014-06-03 13:31:55
【问题描述】:

我正在用 R 编写一个函数,但我陷入了向量子集。

假设我有以下向量:

  ratio<-c(0,0,0,0,1.3,1.4)

我想对所有值 > 0 的向量进行子集化,如果存在一个或多个 0,我想在最终向量中只包含一个 0。

预期输出:

subset<-(0,1.3,1.4)

我尝试了以下方法:

sebset1<-ratio[ratio>0]
subset1
[1] 1.3 1.4

然后我使用 if:

subset2<- if(c(ratio==0)) {append (subset1, 0,after=length(subset1))}

我收到此警告:

Warning message:
In if (c(ratio == 0)) { :the condition has length > 1 and   only the first element will be used

但它有效:

subset2
[1] 1.3 1.4 0.0

但是,此解决方案不适用于没有 0 的向量,例如:

ratio2<-c(3,4,2,3,4)

因为当我使用

if

我得到一个 NULL 向量作为

subset2

知道我可以在哪里改进我的代码吗?

非常感谢您的帮助!

【问题讨论】:

  • 如果0唯一 可以多次出现的值,那么unique(ratio[ratio &gt;= 0]) 就可以了。
  • 非常感谢您的回答。不幸的是,情况并非如此

标签: r vector logic subset


【解决方案1】:

像这样构造代码最接近你对算法的英文描述:

filtered.ratio <- ratio[ratio > 0]
if (any(ratio == 0)) {
  filtered.ratio <- c(filtered.ratio, 0)
}

请注意,append 实际上仅在需要将元素插入到向量的内部位置时才优于 c。这种情况很少发生,因此您可以放心地忘记append

【讨论】:

  • 感谢您的回答!关于append,我不太明白你的意思。你能不能更好地解释一下,或者给我一些好的例子?再次非常感谢!
【解决方案2】:

试试这个.. 它没有子集

#if ratio's value between 0 to +Inf
mysubset = c(ratio[ratio>0],unique(ratio[ratio==0]))

#if ratio's value between -Inf to +Inf and you want to remove only zero like you mentioned in question 
mysubset = c(ratio[ratio!=0],unique(ratio[ratio==0]))

【讨论】:

  • 这太棒了!非常感谢!
  • 只是为了让我理解,诀窍是使用unique,对吗?同一类的重复元素和报表和对象的功能屏幕只需一次。对吗?
  • 只要你的向量有正值和零,它就会起作用。如果你想要它为负值,只需将第一个条件从 ratio>0 更改为 ratio!=0
【解决方案3】:

R 中的if 命令未向量化,因此if(ratio==0) 仅将第一个元素与零进行比较,因此如果第一个零在向量的后面,则不会起作用。试试:

subset1 <- ratio[ratio>0]
if(any(ratio==0)) subset2 <- c(0,subset1) else subset2 <- subset

另请注意,如果在测试为 FALSE 并且没有 else 部分时返回 NULL,这就是导致 NULL 出现问题的原因。

【讨论】:

  • 非常感谢这项工作真的很好!基本上在any 中,您正在寻找所有向量的逻辑条件。如果条件为真,则打印0subset1。如果不是真的subset2=subset1。对吗?
  • 是的,没错,any 只是浓缩了一大堆or 语句,即ratio[1]==0 or ratio[2]==0 or ...
猜你喜欢
  • 2021-06-20
  • 2021-06-16
  • 2018-05-03
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多