根据行值制作列

时间:2019-03-07 15:01:21

标签: r tidyverse

我认为关于此主题已经有一些答案。但是我找不到它。

我有此数据:

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是列名,值是FalseTrue(如果相应的ID没有变量romatic,则为NA。

这是我尝试过的:

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 个答案:

答案 0 :(得分:1)

稍微整理一下数据似乎可以解决问题。具体来说,删除'}。也许还有一种方法可以使用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 = FALSEspread,则可以始终在NA上使用FALSE参数。