Приведение уникальных объектов в столбце к именам переменных и фиктивное кодирование исходных объектов в переменные в R


Возникли проблемы с тем, как создать фиктивный код следующего набора данных.

Пример данных, скажем dataframe = mydata:

ID |     NAMES      |
-- | -------------- |
1  | 4444, 333, 456 |
2  | 333            |
3  | 456, 765       |

Я хотел бы привести только уникальные переменные в именах в качестве переменных столбца и кода, если каждая строка имеет эту переменную или нет, то есть 1 или 0

Желаемый Результат:

ID |     NAMES      | 4444 | 333 | 456 | 765 |
-- | -------------- |------|-----|-----|-----|
1  | 4444, 333, 456 |   1  |  1  |  1  |   0 |
2  | 333            |   0  |  1  |  0  |   0 |
3  | 456, 765       |   0  |  0  |  1  |   1 |

То, что я сделал до сих пор, - это создал вектор уникальных

split <- str_split(string = mydata$NAMES,pattern = ",")

vec <- unique(str_trim(unlist(split)))
remove <- ""
vec <- as.data.frame(vec[! vec %in% remove])
colnames(vec) <- "var"
vecRef <- as.vector(vec$var)

namesCast <- dcast(data = vec,formula = .~var)
namesCast <- nameCast[,2:ncol(namesCast)]
Это дает вектор уникальных имен с удаленными пробелами / нерегулярностями. Оттуда я понятия не имею, как это сделать. совпадение / фиктивное кодирование, так что любая помощь будет очень признательна!
1 5

1 ответ:

Вы можете использовать cSplit_e из моего пакета splitstackshape, например:

library(splitstackshape)
cSplit_e(mydata, "NAMES", sep = ",", type = "character", fill = 0)
#   ID          NAMES NAMES_333 NAMES_4444 NAMES_456 NAMES_765
# 1  1 4444, 333, 456         1          1         1         0
# 2  2            333         1          0         0         0
# 3  3       456, 765         0          0         1         1
Если вы хотите увидеть основную функцию, которая вызывается при использовании этих аргументов, вы можете посмотреть на splitstackshape:::charMat, которая берет list, сгенерированную strsplit, и создает из нее matrix.

Вызов функции напрямую даст вам что-то вроде этого:

splitstackshape:::charMat(
  lapply(strsplit(as.character(mydata$NAMES), ","), 
         function(x) gsub("^\\s+|\\s$", "", x)))
#      333 4444 456 765
# [1,]   1    1   1  NA
# [2,]   1   NA  NA  NA
# [3,]  NA   NA   1   1