我正在尝试将列表从api的json数据转换为data.frame。使用 fromJSON ,我得到一个嵌套的列表结构,我需要在其他一些数据帧上加入这些数据。
因此,列表有点多维(嵌套)。我一直在尝试将多个元素转换为data.frame中的单独列,因为它与其他框架的结构匹配并进行连接。我确信有一种优雅的方式可以做到这一点,但我似乎找不到一个。在最坏的情况下,我可能最终使用 for 循环。
任何帮助将不胜感激!!!!
以下是创建列表的示例数据:
mylist <- list(structure(list(
categoryName = "cat1",
parent_categories = "parent1",
url = "/xyx.com/bca/"),
.Names = c("categoryName", "parent_categories", "url")),
structure(list(
categoryName = "cat2",
parent_categories = c("parent2", "parent3", "parent4"),
url = "/abc.com/bca"),
.Names = c("categoryName", "parent_categories", "url"))
)
我想要的输出应该是这样的
categoryName parent_categories_1 parent_categories_2 parent_categories_3 url
1 cat1 parent1 NA NA /xyx.com/bca/
2 cat2 parent2 parent3 parent4 /abc.com/bca
以下是我使用但未获得所需结果,尽管非常接近
ldply(mylist, function(x){ data.frame(x) })
**MY CURRENT OUTPUT**
categoryName parent_categories url
1 cat1 parent1 /xyx.com/bca/
2 cat2 parent2 /abc.com/bca
3 cat2 parent3 /abc.com/bca
4 cat2 parent4 /abc.com/bca
答案 0 :(得分:4)
这是一种方法,但我确信有更好的方法:
mylist2 <- lapply(lapply(mylist, unlist), function(x) {
names(x)[names(x) == "parent_categories"] <- "parent_categories1"
data.frame(t(x))
})
library(plyr)
rbind.fill(mylist2)
## categoryName parent_categories1 url parent_categories2 parent_categories3
## 1 cat1 parent1 /xyx.com/bca/ <NA> <NA>
## 2 cat2 parent2 /abc.com/bca parent3 parent4
说明:
unlist
将每个嵌套列表放入向量列表plyr
的{{1}}将它拼接在一起您可以使用多种方法重新排列列顺序,但这非常简单。
答案 1 :(得分:1)
这对我来说似乎更直接:
melt
您的list
data.frame
dcast
获取宽幅格式data.frame
library(reshape2)
x <- melt(mylist)
x$time <- with(x, ave(L2, L1, L2, FUN = seq_along))
dcast(x, L1 ~ L2 + time, value.var="value")
# L1 categoryName_1 parent_categories_1 parent_categories_2 parent_categories_3 url_1
# 1 1 cat1 parent1 <NA> <NA> /xyx.com/bca/
# 2 2 cat2 parent2 parent3 parent4 /abc.com/bca