Функция с IF ELSE не работает - PullRequest
0 голосов
/ 29 августа 2018

У меня есть простая функция:

new_function <- function(x)
 {
letters <- c("A","B","C")
new_letters<- c("D","E","F")

 if (x %in% letters) {"Correct"}
 else if (x %in% new_letters) {"Also Correct"}
 else   {x} 
 }

Я делаю dataframe с буквами:

df <- as.data.frame(LETTERS[seq( from = 1, to = 10 )])
names(df)<- c("Letters")

Я хочу применить функцию к dataframe:

  df$result <- new_function(df$Letters)

И это не работает (функция пишет только «Исправить»)

Я получаю это предупреждение:

Предупреждающее сообщение: В if (x% в% букв) {: условие имеет длину> 1, и будет использоваться только первый элемент

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я бы переписал ваш new_function с ifelse, как предложил @akrun. as.character преобразует x в символ, если это фактор:

new_function <- function(x){
  ifelse(x %in% c("A","B","C"), "Correct",
         ifelse(x %in% c("D","E","F"), "Also Correct", as.character(x)))
}

df$result <- new_function(df$Letters)

или case_when из dplyr:

library(dplyr)

new_function <- function(x){
  case_when(x %in% c("A","B","C") ~ "Correct",
            x %in% c("D","E","F") ~ "Also Correct",
            TRUE ~ as.character(x))
}

df %>%
  mutate(result = new_function(Letters))

Результат:

   Letters       result
1        A      Correct
2        B      Correct
3        C      Correct
4        D Also Correct
5        E Also Correct
6        F Also Correct
7        G            G
8        H            H
9        I            I
10       J            J

Данные:

df <- as.data.frame(LETTERS[seq( from = 1, to = 10 )])
names(df)<- c("Letters")
0 голосов
/ 29 августа 2018

Вы можете использовать lapply:

df$result <- lapply(df$Letters,new_function)

Выход:

df
   Letters       result
1        A      Correct
2        B      Correct
3        C      Correct
4        D Also Correct
5        E Also Correct
6        F Also Correct
7        G            7
8        H            8
9        I            9
10       J           10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...