Применение условия на основе списка и создание нового столбца на основе результата r

#r #data-cleaning

#r #очистка данных

Вопрос:

У меня есть следующий список:

 c1 <-("apple", "tree", "husband")
  

и эти данные:

 df <-data.frame(
  ID = c("b","b","b","a","a","c"),
  col = c("husband", "apple", "juice", "happy", "husband", "white"),
)
  

и я хочу получить этот результат:

 df <-data.frame(
  ID = c("b","b","b","a","a","c"),
  col = c("husband", "apple", "juice", "happy", "husband", "white"),
  c1 = c("1","1","0","0","1","0")
)
  

путем применения списка (c1) в качестве условия и не для использования

 mutate(c1= ifelse(col==happy | col==tree | col==husband,1,0))
  

Спасибо

Ответ №1:

Вы можете использовать %in% для проверки c1 значений в col

 transform(df, c1 = as.integer(col %in% c1))
#Even shorter
#transform(df, c1 =  (col %in% c1))

#  ID     col c1
#1  b husband  1
#2  b   apple  1
#3  b   juice  0
#4  a   happy  0
#5  a husband  1
#6  c   white  0
  

Использование as.integer поверх логических значений является более быстрым способом, чем использование ifelse :

 transform(df, c1 = ifelse(col %in% c1, 1, 0))
  

Ответ №2:

Вы можете сыграть хитрость с помощью factor , например,

 within(df, out <-  !is.na(factor(col,levels = c1)))
  

или через %in%

 within(df, out <-  (col %in%c1))
  

или через match

 within(df,out <- 1-is.na(match(col,c1)))
  

такое, что

   ID     col out
1  b husband   1
2  b   apple   1
3  b   juice   0
4  a   happy   0
5  a husband   1
6  c   white   0
  

Ответ №3:

Вы также можете использовать grepl() для проверки любого из значений в c1 и присвоения непосредственно новой переменной:

 #Data 1
c1 <- c("apple", "tree", "husband")
#Data 2
df <-data.frame(
    ID = c("b","b","b","a","a","c"),
    col = c("husband", "apple", "juice", "happy", "husband", "white"),stringsAsFactors = F)
#Match and create new variable
df$NewVar <- as.numeric(grepl(paste0(c1,collapse = '|'),df$col))
  

Вывод:

   ID     col NewVar
1  b husband      1
2  b   apple      1
3  b   juice      0
4  a   happy      0
5  a husband      1
6  c   white      0
  

Ответ №4:

Опция с case_when

 library(dplyr)
df %>%
     mutate(c1 = case_when(col %in% c1, 1, 0))
  

Или другой вариант

 df %>%
    mutate(c1 =  (col %in% c1))