Найти уникальные значения в символьном векторе, разделенном запятыми, а затем однократное кодирование - PullRequest
0 голосов
/ 03 октября 2018

В основном у меня есть вектор строк, разделенных запятыми.Я смотрю одно горячее кодирование, используя уникальные значения строк.Я считаю, что мне нужно сначала найти уникальные значения (разделенные запятыми) для использования в качестве столбцов перед одноразовым кодированием, но я не уверен.Например, скажем, у меня есть следующий символьный вектор:

people_names
Bob,Megan,Mike,Sarah
Mike,Sarah
Megan,Sarah
Bob

Я хочу создать результирующий кадр данных с горячим кодированием, соответствующий этому вектору, например:

Bob   Megan   Mike   Sarah
  1       1      1       1
  0       0      1       1
  0       1      0       1
  1       0      0       0

Спасибо за любую помощь.Я действительно ценю это.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

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

splitstackshape:::charMat(strsplit(people_names, ","), fill = 0L)
#     Bob Megan Mike Sarah
#[1,]   1     1    1     1
#[2,]   0     0    1     1
#[3,]   0     1    0     1
#[4,]   1     0    0     0

Из того же пакета вы также можете попробовать cSplit_e

library(splitstackshape)
out <- cSplit_e(
  data.frame(people_names),
  split.col = "people_names",
  sep = ",",
  mode = "binary",
  type = "character",
  fill = 0L,
  drop = TRUE
)
# remove prefix of column names
(out <- setNames(out, sub("people_names_", "", names(out), fixed = TRUE))) 

data

people_names = c("Bob,Megan,Mike,Sarah",
                 "Mike,Sarah",
                 "Megan,Sarah",
                 "Bob")
0 голосов
/ 03 октября 2018
people_names = c("Bob,Megan,Mike,Sarah",
                 "Mike,Sarah",
                 "Megan,Sarah",
                 "Bob")

library(tidyverse)

data.frame(people_names) %>%                # create a dataframe
  mutate(id = row_number(),                 # add row id (useful for reshaping)
         value = 1) %>%                     # add a column of 1s to denote existence
  separate_rows(people_names) %>%           # create one row per name keeping relevant info
  spread(people_names, value, fill = 0) %>% # reshape
  select(-id)                               # remove row id

#   Bob Megan Mike Sarah
# 1   1     1    1     1
# 2   0     0    1     1
# 3   0     1    0     1
# 4   1     0    0     0
...