#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))