Распространение отдельных столбцов списка - PullRequest
1 голос
/ 08 марта 2019

У меня есть такие данные:

library(tidyverse)
yelp_tbl %>%
select(business_id, categories) 

A tibble: 11 x 2
   business_id            categories
   <chr>                  <list>    
 1 5-1qDFGHvYjBjBYe0B5oiQ <chr [3]> 
 2 isl95tLwXQHlkm_vR0PTqw <chr [6]> 
 3 lNwReGEso2mMhzCr0TM-mw <chr [3]> 
 4 XOvQUSHUjE0KkUuwDUR5OA <chr [1]> 
 5 8Y5p2IQMLX6QjGPzxanexg <chr [4]> 
 6 jozuj1ySOk7DPs7OJloj3A <NULL>    
 7 _TGcRp4wyVbvvDsEHXf0Zw <chr [2]> 
 8 3Mwko7AsZaydBm6d4tWMhg <chr [3]> 
 9 uhdbvZ-yCIl_Yj_sU1OhRg <chr [4]> 
10 ht9AOnxm0IfSoUDJTatS1g <chr [3]> 
11 5P7zzVhWvO8nXGPdy7xqhw <chr [5]>

Каждый бизнес может принадлежать к разным категориям. Таким образом, у каждого бизнеса могут быть разные значения относительно значений переменных и количества переменных.

Я хочу использовать spread, чтобы сделать столбцы из значений переменных, и fill "True" или "False" относительно значений categories.

Код, который я создал до сих пор, выглядит следующим образом:

yelp_tbl %>%
  select(business_id, categories) %>%
  mutate(dummy = "True") %>%
  map(unlist) %>%
  as.data.frame() %>%
  mutate_if(is.factor, as.character) %>%
  spread(categories, dummy, fill = "False")

Но я получаю эту ошибку:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 5, 26

Я понимаю, что это значит, но я не знаю, как это исправить в этом случае.

structure(list(business_id = c("5-1qDFGHvYjBjBYe0B5oiQ", "isl95tLwXQHlkm_vR0PTqw", 
"lNwReGEso2mMhzCr0TM-mw", "XOvQUSHUjE0KkUuwDUR5OA", "8Y5p2IQMLX6QjGPzxanexg", 
"jozuj1ySOk7DPs7OJloj3A", "_TGcRp4wyVbvvDsEHXf0Zw", "3Mwko7AsZaydBm6d4tWMhg", 
"uhdbvZ-yCIl_Yj_sU1OhRg", "ht9AOnxm0IfSoUDJTatS1g", "5P7zzVhWvO8nXGPdy7xqhw"
), categories = list(c("Dry Cleaning & Laundry", "Local Services", 
"Sewing & Alterations"), c("Beauty & Spas", "Skin Care", "Medical Spas", 
"Hair Removal", "Health & Medical", "Laser Hair Removal"), c("Food", 
"Grocery", "Specialty Food"), "Restaurants", c("Japanese", "Restaurants", 
"Korean", "Sushi Bars"), NULL, c("Financial Services", "Banks & Credit Unions"
), c("Nightlife", "Dance Clubs", "Bars"), c("Gyms", "Active Life", 
"Trainers", "Fitness & Instruction"), c("Event Planning & Services", 
"Hotels", "Hotels & Travel"), c("Donuts", "Breakfast & Brunch", 
"Restaurants", "Food", "Coffee & Tea"))), row.names = c(NA, -11L
), class = c("tbl_df", "tbl", "data.frame"))

1 Ответ

2 голосов
/ 08 марта 2019

Мы можем использовать:

Чтобы покончить с вложением:

Редактировать: Измените NULL на False сначала.

  df$categories[sapply(df$categories,is.null)]<-"False"
df %>% 
  select(business_id, categories) %>%
  head(5) %>% 
  tidyr::unnest(categories) %>% 
  mutate(dummy = "True") %>% 
  mutate_if(is.factor, as.character) %>%
  tidyr::spread(categories, dummy, fill = "False")

Otherwsie,

library(dplyr)
    df %>% 
     select(business_id, categories) %>%
      head(5) %>%
      mutate(dummy = "True",New=purrr::map(categories,unlist)) %>% 
      as.data.frame() %>%
      mutate_if(is.factor, as.character) %>%
      tidyr::spread(categories, dummy, fill = "False")
...