【发布时间】:2015-10-14 17:04:35
【问题描述】:
我的数据框中有几个 bin。
[1] "bin1" "bin2" "bin3" "bin4" "bin5" "bin6"
我有一个 bin 编号,并且想排除除该 bin 和前一个 bin 之外的所有内容。如果 bin=1,我只想排除除 bin1 之外的所有内容(bin0 不存在)。 为了生成一个 bin 名称向量以便稍后从我的数据框中排除,我生成:
BinsToDelete <- ifelse(i>1, paste("bin",1:6,sep="")[-((i-1):i)],paste("bin",1:6,sep="")[-i])
为了便于理解
> i=3
> paste("bin",1:6,sep="")[-((i-1):i)]
[1] "bin1" "bin4" "bin5" "bin6"
> paste("bin",1:6,sep="")[-i]
[1] "bin1" "bin2" "bin4" "bin5" "bin6"
奇怪的是 ifelse 语句会产生这样的结果:
> i=3
> BinsToDelete <- ifelse(i==1, paste("bin",1:6,sep="")[-i],paste("bin",1:6,sep="")[-((i-1):i)])
> BinsToDelete
[1] "bin1"
那里发生了什么?
一个普通的 if-else 语句会给出想要的结果:
> if(i==1){
BinsToDelete <- paste("bin",1:6,sep="")[-i]
} else { BinsToDelete <- paste("bin",1:6,sep="")[-((i-1):i)]}
> BinsToDelete
[1] "bin1" "bin4" "bin5" "bin6"
感谢您帮助我了解 ifelse 是如何得出这个结论的。
【问题讨论】:
-
ifelse()返回一个与其输入长度相同的向量(即i == 1)。由于i <- 3,你得到了一个值。 -
Fwiw,不要这样做。也许
paste("bin",1:6,sep="")[-c(i, if (i>1) i-1)] -
谢谢!并感谢弗兰克的建议。完成这项工作的最短代码获胜!
标签: r if-statement