R中的逻辑向量子集

时间:2014-06-03 13:31:56

标签: r vector logic subset

我在R中写了一个函数,我陷入了矢量子集中。

我们假设我有以下向量:

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

我想将所有值的向量子集&gt; 0和IF存在一个或多个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

知道我可以改进代码吗?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

像这样构建代码最类似于您对英语算法的描述:

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

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

答案 1 :(得分:1)

试试这个..没有子集

#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]))

答案 2 :(得分:1)

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

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

另请注意,如果测试为NULL并且没有FALSE部分时返回else,那么导致您出现{{1}问题的原因是什么}}