【问题标题】:Ifelse() with three conditionsifelse() 三个条件
【发布时间】:2023-03-23 00:11:01
【问题描述】:

我有两个向量:

a<-rep(1:2,100)

b<-sample(a)

我想要一个 ifelse 条件,将a 的每个值与b 的相应值进行比较,并执行以下操作:

if a>b 1
if a<b 0
if a=b sample(1:2,length(a),replace=T)

前两个可以用:

ifelse(a>b,1,0)

但我不确定如何合并ab 相等的情况。

【问题讨论】:

  • 考虑也使用switch,这仅适用于这种情况(您有 if/else/else/else...)。将其与apply 结合使用可能会让您优雅地到达您想去的地方。

标签: r


【解决方案1】:

添加另一个 ifelse 怎么样:

ifelse(a>b, 1, ifelse(a==b, sample(1:2, length(a), replace = TRUE), 0))

在这种情况下,如果 a>b,您将得到值 1,然后,如果 a 等于 b,则它是 1 或 2 (sample(1:2, length(a), replace = TRUE)),如果不是(因此 a 必须小于 b),您将得到值为 0。

【讨论】:

  • 这将为每个a==b复制sample(1:2,1)
  • sample(1:2,1) 可以替换为 sample(1:2, length(a), replace = TRUE)sample(a) 现在 OP 已经澄清这就是他想要的。
  • 我建议使用sample(1:2, length(a), replace = TRUE),因为它并不总是与sample(a)具有相同的分布。
【解决方案2】:

这是一个简单的方法:

(a > b) + (a == b) * sample(2, length(a), replace = TRUE)

这是基于将布尔值转换为数值的计算。

【讨论】:

    【解决方案3】:

    您的问题有歧义。您想要a==b 的所有索引使用不同的随机值还是所有索引使用一个随机值?

    @Rob 的答案将适用于第二种情况。对于第一种情况,我建议避免使用ifelse

    u<-rep(NA,length(a))
    u[a>b] <- 1
    u[a<b] <- 0
    u[a==b] <- sample(1:2,sum(a==b),replace=TRUE)
    

    【讨论】:

    • 是的,你是对的,我希望每个索引都有不同的随机值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多