我在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
知道我可以改进代码吗?
非常感谢你的帮助!
答案 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}问题的原因是什么}}