R: преобразовать строку с разделителями в переменные
У меня есть кадр данных со столбцом, содержащим список кодов символов, разделенных пробелами:
"Ab BC" "" "XC" "N Ab FS" :
Я хочу преобразовать это в несколько столбцов, по одному для каждого отдельного значения, указав (с 1 или 0), что это значение было найдено в списке. Желаемый результат приведен выше:
df$Ab = 1,0,0,1 df$B = 1,0,0,0 df$C = 1,0,1,0 df$F = 0,0,0,1 df$N = 0,0,0,1
Каков наилучший способ сделать это?
- Стандартный способ удаления нескольких элементов из фрейма данных
- Извлечь месяц и год из зоопарка :: объект yearmon
- листинг содержимого файла данных R без загрузки
- Возвращаемый индекс наименьшего значения в векторе?
- R Ошибка в операторе x $ ed: $ недействительна для атомных векторов
- Скомпилировать R-скрипт в автономный .exe-файл?
- Не удалось установить пакеты в последней версии RStudio и R версии.3.1.1
- Добавить переменную в кадр данных, содержащий максимальное значение каждой строки
- Использование R для отображения всех файлов с указанным расширением
- Манекены переменных из строковой переменной
- Форматирование больших валютных или долларовых значений в миллионы / миллиарды
- как получить значение, когда имя переменной передается как строка
- Удалите все знаки препинания, кроме апострофов в R
Предполагая, что вы начинаете с:
df <- data.frame(v1 = c("Ab BC", "", "XC", "N Ab FS"))
Вы можете попробовать cSplit_e
из моего пакета splitstackshape:
library(splitstackshape) cSplit_e(df, "v1", sep = " ", type = "character", fill = 0) # v1 v1_Ab v1_B v1_C v1_F v1_N v1_S v1_X # 1 Ab BC 1 1 1 0 0 0 0 # 2 0 0 0 0 0 0 0 # 3 XC 0 0 1 0 0 0 1 # 4 N Ab FS 1 0 0 1 1 1 0
Можешь попробовать
library(qdapTools) lst <- strsplit(df1$Col1, ' ') cbind(df1, mtabulate(lst)) # Col1 Ab BCFNSX #1 Ab BC 1 1 1 0 0 0 0 #2 0 0 0 0 0 0 0 #3 XC 0 0 1 0 0 0 1 #4 N Ab FS 1 0 0 1 1 1 0
Или используя base R
lvls <- sort(unique(unlist(lst))) cbind(df1, t(vapply(lst, function(x) table(factor(x, levels=lvls)), numeric(length(lvls)))))
данные
df1 <- structure(list(Col1 = c("Ab BC", "", "XC", "N Ab FS")), .Names = "Col1", row.names = c(NA, -4L), class = "data.frame")
В базе R другой подход:
lst = strsplit(df$Col1, ' ') cols = unique(unlist(lst)) m = do.call(rbind, lapply(lst, function(u) cols %in% u +0)) colnames(m) = cols #> m # Ab BCXNFS #[1,] 1 1 1 0 0 0 0 #[2,] 0 0 0 0 0 0 0 #[3,] 0 0 1 1 0 0 0 #[4,] 1 0 0 0 1 1 1