Я хотел бы использовать оператор if else, чтобы создать новый столбец в моем фрейме данных на основе данных из другого столбца. Я просмотрел ряд предыдущих (например, этот и этот), но, похоже, что-то делает не так, поскольку я либо получаю ошибка или нет нового столбца.

Я пробовал создать функцию ifelse:

  if(x >= 4000)
{print (">4000")
  } else if (x >=3000 & x <= 4000) 
    {print ("3000-4000")
    } else if  (x >=2000 & x <= 3000) 
    {print("2000-3000")
      } else if (x >=1000 & x <= 2000)
      {print("1000-2000")
      } else print ("<1000")}

Эта функция работает / выполняется, но я не могу понять, как применить ее к одному столбцу в моем фрейме данных (я пробовал это dat$P.bins <- Bins(dat$Pcol), но получил следующую ошибку: длина условия> 1 и только первый элемент будет использоваться 1 "> 4000"

Я также пытался запустить оператор ifelse:

dat$P.bin<- ifelse(P.col>=4000, ">4000",
                                ifelse(P.col <=4000 & >= 3000, "3000-4000"),
                                ifelse(P.col<=3000 & >= 2000, "2000-3000"), 
                                ifelse(P.col <=2000 & >=1000, "1000-2000"), 
                                ifelse(P.col <1000, "1000"))

Но получите эту ошибку: Ошибка: неожиданно '> =' в: "dat $ P.bins <- ifelse (Pcol> = 4000,"> 4000 ", felse (Pcol <= 4000 &> =". С этим утверждением я ' m не уверен, как сделать диапазон в операторе ifelse.

Любая помощь или руководство будет принята с благодарностью!

1
clions226 11 Июн 2021 в 23:13

2 ответа

Лучший ответ

Мы можем использовать case_when вот так:

library(tidyverse)

dat <- tibble(P.col = seq(0, 20000, 1000))

mutate(dat, P.bin = case_when(P.col >= 4000 ~ ">4000",
                              P.col <= 3000 & P.col >= 2000 ~ "2000-3000",
                              P.col <= 3000 & P.col >= 2000 ~ "2000-3000",
                              P.col <= 2000 & P.col >=1000 ~ "1000-2000",
                              P.col < 1000 ~ "1000"))
#> # A tibble: 21 x 2
#>    P.col P.bin    
#>    <dbl> <chr>    
#>  1     0 1000     
#>  2  1000 1000-2000
#>  3  2000 2000-3000
#>  4  3000 2000-3000
#>  5  4000 >4000    
#>  6  5000 >4000    
#>  7  6000 >4000    
#>  8  7000 >4000    
#>  9  8000 >4000    
#> 10  9000 >4000    
#> # … with 11 more rows

Создано 11.06.2021 с помощью пакета REPEX (v2.0.0)

3
jpdugo17 11 Июн 2021 в 20:28

Подход ifelse, который вы используете, верен, но у вас есть некоторые проблемы с синтаксисом.

  • Вы не закрываете скобки в нужном месте.
  • Никакого упоминания имени фрейма данных в ifelse. Сама по себе P.col недостаточно.
  • P.col <=4000 & >= 3000 недействителен. Вам нужно P.col <=4000 & P.col >= 3000.

Попробуйте следующий код -

dat$P.bin<- with(dat, ifelse(P.col>=4000, ">4000",
                   ifelse(P.col <=4000 & P.col >= 3000, "3000-4000",
                   ifelse(P.col<=3000 & P.col >= 2000, "2000-3000", 
                   ifelse(P.col <=2000 & P.col >=1000, "1000-2000", 
                   ifelse(P.col <1000, "1000", NA_character_))))))

Сказав, что использование case_when, предложенное @ jpdugo17, может быть более чистым способом сделать это.

1
Ronak Shah 12 Июн 2021 в 03:00