Создание столбцов из значений строк - PullRequest
0 голосов
/ 07 марта 2019

Я предполагаю, что на эту тему уже есть некоторые ответы.Но я не могу его найти.

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

library(tidyverse)
glimpse(samp)
Observations: 5
Variables: 2
$ business_id <chr> "--6MefnULPED_I942VcFNA", "--9e1ONYQuAa-CB_Rrw7Tw", "--...
$ Ambience    <chr> "romantic': False, 'intimate': False, 'classy': False, ...

Я хочу сделать значения до : в качестве имени столбца и значения после : в качестве значенияНапример, romatic - это имя столбца, а значение - False или True (или NA, если соответствующий идентификатор не имеет переменной romatic.

Это то, что я пробовал:

samp %>%
  mutate(Ambience = strsplit(Ambience, ",")) %>%
  unnest() %>%
  separate(Ambience, into = c("key", "value")) %>%
  spread(key, value) 

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

Error: Duplicate identifiers for rows (2, 3, 4, 5, 6, 7, 8), (10, 11, 12, 13, 14, 15, 16, 17), (19, 20, 21, 22, 23, 24, 25, 26), (28, 29, 30, 31, 32, 33, 34, 35), (37, 38, 39, 40, 41, 42, 43) Call `rlang::last_error()` to see a backtrace

Вот dput:

structure(list(business_id = c("--6MefnULPED_I942VcFNA", "--9e1ONYQuAa-CB_Rrw7Tw", 
"--cjBEbXMI2obtaRHNSFrA", "--cZ6Hhc9F7VkKXxHMVZSQ", "--DaPTJW3-tB1vP-PfdTEg"
), Ambience = c("romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': True}", 
"romantic': False, 'intimate': False, 'classy': True, 'hipster': False, 'divey': False, 'touristy': False, 'trendy': False, 'upscale': True, 'casual': False}", 
"romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'divey': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': False}", 
"romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'divey': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': True}", 
"romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': True}"
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))

1 Ответ

1 голос
/ 07 марта 2019

Казалось, что немного больше приведёт в порядок ваши данные.В частности, удаление ' и }.Также может быть способ проанализировать это с помощью jsonlite, но я не исследовал, что:

library(tidyverse)

samp %>%
  mutate(Ambience = strsplit(str_remove_all(Ambience, '[\'|}]'), ",")) %>%
  unnest() %>%
  mutate_at(vars(Ambience), str_trim) %>%
  separate(Ambience, into = c("key", "value")) %>%
  spread(key, value)

# A tibble: 5 x 10
  business_id            casual classy divey hipster intimate romantic touristy trendy upscale
  <chr>                  <chr>  <chr>  <chr> <chr>   <chr>    <chr>    <chr>    <chr>  <chr>  
1 --6MefnULPED_I942VcFNA True   False  NA    False   False    False    False    False  False  
2 --9e1ONYQuAa-CB_Rrw7Tw False  True   False False   False    False    False    False  True   
3 --cjBEbXMI2obtaRHNSFrA False  False  False False   False    False    False    False  False  
4 --cZ6Hhc9F7VkKXxHMVZSQ True   False  False False   False    False    False    False  False  
5 --DaPTJW3-tB1vP-PfdTEg True   False  NA    False   False    False    False    False  False  

вы всегда можете использовать аргумент fill = FALSE для spread, если хотите принять NA is FALSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...