【问题标题】:ifelse() with unexpected results in Rifelse() 在 R 中出现意外结果
【发布时间】: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 &lt;- 3,你得到了一个值。
  • Fwiw,不要这样做。也许paste("bin",1:6,sep="")[-c(i, if (i&gt;1) i-1)]
  • 谢谢!并感谢弗兰克的建议。完成这项工作的最短代码获胜!

标签: r if-statement


【解决方案1】:

来自?ifelse

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’.

在你的情况下:

> i <- 3
> length(i)
[1] 1

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

【讨论】:

    【解决方案2】:

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

    > 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 函数解决了其中一些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2013-05-02
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多