С решением data.table
вы можете использовать tstrsplit
:
library(data.table)
df <- data.table::data.table(
color = c("red;blue", "red;green")
)
df[, c("col1","col2") := tstrsplit(color, ";", fixed = TRUE)]
df[, "green" := (col2 == "green")]
df
# color col1 col2 green
# 1: red;blue red blue FALSE
# 2: red;green red green TRUE
Если вы не знакомы с data.table
оператором обновления по ссылке :=
, data.table
виньетки хорошее место для начала. Опция fixed = TRUE
в tstrsplit
предполагает, что у вас всегда есть одинаковое количество элементов в списке, разделенном запятыми.
Существует решение, которое, я думаю, более приспособлено к ситуации, когда у вас больше чем несколько значений. Повторно используя lapply
, вы можете добавить ряд столбцов к вашему data.table
Начиная с df
:
df <- data.table::data.table(
color = c("red;blue", "red;green")
)
Вызов lapply
с grepl
для сканирования для соответствующего цвета мы обновляем по ссылке наш объект (обратите внимание, что вы можете использовать более трех цветов):
lapply(c("red","green","blue"), function(x){
df[grepl(x, color), c(as.character(x)) := TRUE]
})
#[[1]]
#[[2]]
# color red green blue
#1: red;blue TRUE NA TRUE
#2: red;green TRUE TRUE NA
#[[3]]
# color red green blue
#1: red;blue TRUE NA TRUE
#2: red;green TRUE TRUE NA
Нет необходимости переназначать фрейм данных. Он был обновлен по ссылке. Нас интересует только последний слот df
. Наконец, выбрав этот параметр и установив NAs
в FALSE
:
df <- df[[length(df)]]
df[is.na(df)] <- FALSE
df
# color red green blue
# 1: red;blue TRUE FALSE TRUE
# 2: red;green TRUE TRUE FALSE
Надеюсь, это поможет