【问题标题】:Case when with condition loop有条件循环的情况
【发布时间】:2020-03-20 19:40:35
【问题描述】:

我是 R 新手。我写了一个代码案例,但我想参数化,因为我并不总是有 n = 5。 有可能吗?

iris 
iris$id_1 = sample(1:10)
iris$id_2 = sample(1:10)
iris$id_3 = sample(1:10)
iris$id_4 = sample(1:10)
iris$id_5 = sample(1:10)

x = 3

iris <- 
  iris %>%
  mutate(
    segmento = 
      case_when(
        id_5 >= x ~ 5,
        id_4 >= x ~ 4,
        id_3 >= x ~ 3,
        id_2 >= x ~ 2,
        id_1 >= x ~ 1,
      )
  )

问题是我并不总是有 5 个“id”。有时我有 3 和代码它将是:

  iris <- 
      iris %>%
      mutate(
        segmento = 
          case_when(
            id_3 >= x ~ 3,
            id_2 >= x ~ 2,
            id_1 >= x ~ 1,
          )
      )

然后我需要对其进行参数化。

谢谢

【问题讨论】:

  • 你能展示一个可重现的小例子和预期的输出

标签: r case case-when


【解决方案1】:

不是使用多个case_when,而是根据描述,我们可以这样做(如果我们要比较列名中的数字,则将那个数字与sub提取出来,进行比较并得到与@987654323的列索引@ 在逻辑矩阵上。在这里,我们指定last,这样如果我们有一行带有c(FALSE, TRUE, TRUE, TRUE),它给出的列索引为4

nm1 <- grep("^id_\\d+", names(df), value = TRUE)
max.col(df[nm1] >= as.numeric(sub("id_", "", nm1))[col(df[nm1])], "last")

基于更新后的带有“iris”示例的帖子

nm1 <- grep("^id_\\d+", names(iris), value = TRUE)
max.col(iris[nm1] >= x, "last")

【讨论】:

  • 不是最大,有订单。第一优先级是最后 (5) ...
  • 但你不使用“x”。 X 是参考值。如果最后一个级别的值大于 x,那么它将是最后一个。如果不是,则必须检查下杆。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多