Случай, когда с условным циклом - PullRequest
1 голос
/ 20 марта 2020

Я новичок в 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,
          )
      )

Тогда мне нужно его параметризировать.

Спасибо

1 Ответ

1 голос
/ 20 марта 2020

Вместо использования нескольких case_when, основываясь на описании, мы можем это сделать (если мы сравниваем число в имени столбца, извлекаем это число с помощью sub, делаем сравнение и получаем индекс столбца с max.col на логической матрице. Здесь мы указываем 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")
...