Как я могу применить функцию со стриктурой ifelse? - PullRequest
0 голосов
/ 28 ноября 2018

Я создаю новую функцию:

  newFunction <- function (varX) {

  lst_a <- c("aa", "bb", "cc")
  lst_b <- c("dd", "ee", "ff")
  lst_c <- c("gg", "hh", "ii")

  ifelse(varX %in% lst_a , x.out <- "List A" , x.out <- "Other List" )
  ifelse(varX %in% lst_b , x.out <- "List B" , x.out )
  ifelse(varX %in%  lst_c , x.out <- "List C" , x.out)

  return(x.out)

 }

Когда я проверяю функцию, она работает хорошо.Но когда я применяю его к кадру данных, он не работает:

     df <- as.data.frame(c("aa","cc","kk", "nn"))
    df$new <- newFunction((df[,1]))

Я ожидал получить «Список A», «Список A», «Другой список», «Другой список» - но не повезлоесть ли у меня, и осталось со мной "Другой список", "Другой список", "Другой список", "Другой список"

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Сделайте это следующим образом:

newFunction <- function (varX) {
   lst_a <- c("aa", "bb", "cc")
   lst_b <- c("dd", "ee", "ff")
   lst_c <- c("gg", "hh", "ii")

   x.out = ifelse(varX %in% lst_a , "List A" , 
             ifelse(varX %in% lst_b , "List B",
               ifelse(varX %in%  lst_c , "List C" , "Other List")))    
   return(x.out)    
 }

Теперь это векторизация, и вы можете сделать df$new <- newFunction(df[,1]), и это намного эффективнее.

Я настоятельно рекомендую чтениеэтот R-FAQ чтобы понять ifelse против if(){}else{}.

0 голосов
/ 28 ноября 2018

Вы можете попробовать либо

sapply (df[,1], newFunction)

, либо

map(df[,1], newFunction)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...