在R中嵌入data.frames的嵌套列表

在R中嵌入data.frames的嵌套列表,r,dplyr,tidyr,jsonlite,R,Dplyr,Tidyr,Jsonlite,设置: 我有一个带有嵌入的data.frames列表的TIBLE(命名数据) df1 <- data.frame(name = c("columnName1","columnName2","columnName3"), value = c("yes", 1L, 0L), stringsAsFactors = F) df2 <- data.frame(name = c("columnName1","columnN

设置:

我有一个带有嵌入的data.frames列表的TIBLE(命名数据)

df1 <- data.frame(name = c("columnName1","columnName2","columnName3"),
                  value = c("yes", 1L, 0L),
                  stringsAsFactors = F)

df2 <- data.frame(name = c("columnName1","columnName2","columnName3"),
                  value = c("no", 1L, 1L),
                  stringsAsFactors = F)

df3 <- data.frame(name = c("columnName1","columnName2","columnName3"),
                  value = c("yes", 0L, 0L),
                  stringsAsFactors = F)

responses = list(df1,
                 df2,
                 df3)

data <- tibble(ids = c(23L, 42L, 84L),
               responses = responses)
我不雅观的解决方案:

使用
dplyr::bind_rows()
tidyr::spread()

rdf%
tidyr::spread(key=“name”,-id)
目标2%
as.tibble()
将我的解决方案与目标进行比较:

# produced tibble
> goal2
# A tibble: 3 x 4
    ids columnName1 columnName2 columnName3
* <int> <chr>       <chr>       <chr>      
1    23 yes         1           0          
2    42 no          1           1          
3    84 yes         0           0          
#生成的TIBLE
>目标2
#一个tibble:3x4
ids columnName1 columnName2 columnName3
*                      
123是10
2 42 no 1 1
3 84是0 0
总体而言,我的解决方案可行,但存在一些问题:

  • 我不知道如何通过
    bind_rows()
    传递唯一的id,这迫使我创建一个与原始id(“id”)不匹配的虚拟id(“id”)。这迫使我使用
    cbind()
    (我不喜欢),并手动删除虚拟id(在
    rdf
    上使用-1切片)

  • 当我的方法将整数列转换为字符时,列的格式将丢失


  • 关于如何改进我的解决方案(特别是使用基于tidyverse的软件包,如tidyjson或tidyr)的任何建议?

    我们可以使用
    映射
    将“responses”列循环,然后使用
    convert=TRUE
    将其扩展为“wide”,这样列类型,使用
    transmute
    将其创建为一列,然后使用
    unest

    library(tidyverse)
    data %>% 
         transmute(ids, ind = map(responses, ~.x %>% 
                                      spread(name, value, convert = TRUE)))  %>%
         unnest
    # A tibble: 3 x 4
    #    ids columnName1 columnName2 columnName3
    #   <int> <chr>             <int>       <int>
    #1    23 yes                   1           0
    #2    42 no                    1           1
    #3    84 yes                   0           0
    

    执行
    c('yes',0,0)
    时,数据类型信息从一开始就丢失了。也许您可以显示json文件的外观。应该有更好的方法来阅读它们。
    # produced tibble
    > goal2
    # A tibble: 3 x 4
        ids columnName1 columnName2 columnName3
    * <int> <chr>       <chr>       <chr>      
    1    23 yes         1           0          
    2    42 no          1           1          
    3    84 yes         0           0          
    
    library(tidyverse)
    data %>% 
         transmute(ids, ind = map(responses, ~.x %>% 
                                      spread(name, value, convert = TRUE)))  %>%
         unnest
    # A tibble: 3 x 4
    #    ids columnName1 columnName2 columnName3
    #   <int> <chr>             <int>       <int>
    #1    23 yes                   1           0
    #2    42 no                    1           1
    #3    84 yes                   0           0
    
    bind_rows(setNames(data$responses, data$ids), .id = 'ids') %>% 
                spread(name, value, convert = TRUE)