首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中出现意外结果的ifelse()

在R中出现意外结果的ifelse()
EN

Stack Overflow用户
提问于 2015-10-15 01:04:36
回答 2查看 170关注 0票数 0

我的数据框里有几个箱子。

代码语言:javascript
复制
[1] "bin1" "bin2" "bin3" "bin4" "bin5" "bin6"

我有一个仓位编号,并希望排除除该仓位和前一个仓位之外的所有仓位。如果为bin=1,我只想排除除bin1之外的所有内容(bin0不存在)。为了生成稍后从我的数据帧中排除的bin名称向量,我生成:

代码语言:javascript
复制
BinsToDelete <- ifelse(i>1, paste("bin",1:6,sep="")[-((i-1):i)],paste("bin",1:6,sep="")[-i])

为了便于理解

代码语言:javascript
复制
> 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语句会产生这样的结果:

代码语言:javascript
复制
> 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语句会给出预期的结果:

代码语言:javascript
复制
> 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是如何得出这个结论的。

EN

回答 2

Stack Overflow用户

发布于 2015-10-15 01:11:50

来自?ifelse

代码语言:javascript
复制
Value:

     A vector of the same length and attributes (including dimensions
     and ‘"class"’) as ‘test’ and data values from the values of ‘yes’
     or ‘no’.

在您的案例中:

代码语言:javascript
复制
> i <- 3
> length(i)
[1] 1

所以你得到了一个长度为1的输出

票数 2
EN

Stack Overflow用户

发布于 2015-10-15 01:38:55

我通常在可能的情况下避免使用ifelse,因为我认为生成的代码在美学上令人不快。事实上,它删除了类属性,并使处理因子、日期和数据时间变得困难,这是避免它的另一个原因。grep`函数旨在返回一个适合索引选择的向量:

代码语言:javascript
复制
> z=3
> grep( paste0("bin",(z-1):z, collapse="|") , x)
[1] 2 3
> x[ grep( paste0("bin",(z-1):z, collapse="|") , x)]
[1] "bin2" "bin3"
> z=1
> x[ grep( paste0("bin",(z-1):z, collapse="|") , x)]
[1] "bin1"

我的理解是dplyr if_else函数解决了其中的一些问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33131469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档