Эффективно создавать фиктивные переменные в R? - PullRequest
2 голосов
/ 27 февраля 2020

Как мы можем преобразовать данные вида

df <- structure(list(customer_number = c(3, 3, 1, 1, 3), 
                     item = c("milkshake","burger", "apple", "burger", "water")
                       ), 
                row.names = c(NA, -5L), class = "data.frame")


#   customer_number      item
# 1               3 milkshake
# 2               3    burger
# 3               1     apple
# 4               1    burger
# 5               3     water

в фиктивные переменные с числовым кодированием, например,


data.frame(customer_number=c(1,3),
           item_milkshake=c(0,1),
           item_burger=c(1,1),
           item_apple=c(1,0),
           item_water=c(0,1))

#   customer_number item_milkshake item_burger item_apple item_water
# 1               1              0           1          1          0
# 2               3              1           1          0          1

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Мы можем создать фиктивный столбец со значением 1 и получить данные в широком формате.

library(dplyr)

df %>%
  mutate(n = 1) %>%
  arrange(customer_number) %>%
  tidyr::pivot_wider(names_from = item, values_from = n,
                     values_fill = list(n = 0), names_prefix = "item_")

# A tibble: 2 x 5
#  customer_number item_apple item_burger item_milkshake item_water
#            <dbl>      <dbl>       <dbl>          <dbl>      <dbl>
#1               1          1           1              0          0
#2               3          0           1              1          1
1 голос
/ 27 февраля 2020

Если вы хотите использовать функции basi c R, вот простое решение с использованием функции table ():

#Create the dataset
df <- structure(list(customer_number = c(3, 3, 1, 1, 3), item = c("milkshake", 
                                                             "burger", "apple", "burger", "water")), row.names = c(NA, -5L

res <- as.matrix(table(df$customer_number,df$item))
res[res > 0 ] <- 1 #dummy variable
res

    apple burger milkshake water
  1     1      1         0     0
  3     0      1         1     1

Вы можете добавить customer_number как отдельный столбец в матрицу:

res <- cbind(customer_number = as.numeric(rownames(res)), res)
res

  customer_number apple burger milkshake water
1               1     1      1         0     0
3               3     0      1         1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...