在R中嵌入data.frames的嵌套列表
设置: 我有一个带有嵌入的data.frames列表的TIBLE(命名数据)在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
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)