R:使用tidytext :: unnest_tokens聚合相反。多变量和大写

时间:2018-01-05 08:59:40

标签: r reshape tidytext

跟进this question,我想执行与t.save(using='default', update_fields=['last_accessed'])相对应的任务(或下面的MWE中的aggregate等效项),以便获得 df1 < / strong>再次,从 df2 开始。

此处的任务是从 df2 重现 df1 。为此,我尝试了data.table,但是当多个变量必须是&#34; dis-aggregated&#34;时,我无法弄清楚如何使其正常工作。 (模型国家)。

保留变量的原始大写也很好。

任何与tidytext::unnest_tokens不同的优雅解决方案都将被接受!谢谢!

这是MWE:

tidytext::unnest_tokens

2 个答案:

答案 0 :(得分:2)

我会使用dplyr::mutate_at()stringr::str_split()tidyr::unnest()执行此操作。

library(tidyverse)  

df2 %>%
  mutate_at(vars(models:years), ~ str_split(., pattern = " /// ")) %>%
  unnest()

#> # A tibble: 15 x 4
#>    brand models countries years
#>    <chr> <chr>  <chr>     <chr>
#>  1 A     A1     P         91   
#>  2 A     A1     G         92   
#>  3 A     A2     S         93   
#>  4 A     A3     S         94   
#>  5 B     B1     P         98   
#>  6 B     B2     P         95   
#>  7 B     B2     F         87   
#>  8 B     B2     I         99   
#>  9 B     B3     D         0    
#> 10 C     C1     S         86   
#> 11 C     C1     F         92   
#> 12 C     C2     F         92   
#> 13 D     D1     G         93   
#> 14 D     D2     I         95   
#> 15 E     E1     S         99

请注意,最后一列仍然是chr类型,因此如果您想将其恢复为数字,则需要再使用一个mutate()

答案 1 :(得分:1)

我们可以使用separate_rows

library(tidyverse)
res <- df2 %>% 
         separate_rows(models, countries, years, convert = TRUE) %>%
         rename_all(funs(paste0(names(df1)))) %>% #just to make the column names same as df1
         mutate(year = as.numeric(year)) #convert to numeric to match df1 column type
all.equal(res, df1 %>% 
                  mutate_at(2:3, as.character), check.attributes = FALSE )
#[1] TRUE