1

我正在从 JSON 文件中取消嵌套数据。当我制作一个小样本时, unnest() 函数可以工作,但是当我尝试在大型原始数据帧上运行它时,我收到以下错误。

`Error in bind_rows_(x, .id) : 
  Column lines can't be converted from integer to list`

我的代码如下。我们从 GitHub 的 API 获得 JSON 数据。

`repo_data <- fromJSON("data/data/repos.json")`

小数据帧,只有前 100 行

`repo_small <- head(repo_data, 100)`

整洁的 repo 数据,未列出语言和代码行

`df_repo <- repo_small %>% select(ownerName, name, languages, ownerType) %>% unnest()`

当我过滤或任何其他奇怪的事情时,没有 NA 行。我需要取消嵌套的唯一列是语言。

Languages 是一个包含 2 个列表的列表。第一个列表是名称,具有“Java”、“Python”和“Ruby”等值。这些是字符值。第二个列表是行,具有 104、109432 和 10 等值。这些是整数值。

根据要求提供一些示例代码来复制数据。testdf 将是相关列的数据框和语言。

`owner <- c("github", "palentir", "apple")
gitcode <- data.frame(name = c("java"), lines=c(81))
palentircode <- data.frame(name= c("java", "python", "R"), lines=c(200, 45,903))
applecode <- data.frame(name=c("java", "ruby"), lines=c(12, 120))
langauge <- list(gitcode, palentircode, applecode)
testdf <- data.frame(owner)
testdf$language <- langauge`

带有语言的数据框

4

1 回答 1

2

从文档unnest()

unnest() 可以处理可以是原子向量、列表或数据帧的列表列(但不能处理不同类型的混合)。

您的列表中有两种不同的原子类型。我不知道这是否是您的数据结构,没有评论中要求的可重现示例,但这说明了unnest()

DF <- data.frame(a = 1:2)
DF$name <- list(c("Java", "Python", "Ruby"), c(104L, 109432L, 10L))
unnest(DF, name)
# will fail because of the requirements of unnest

如果这是问题所在,您必须先将列表的第二个元素转换为字符。

D$name[[2]] <- as.character(DF$name[[2]])
unnest(DF, name)
#   a   name
# 1 1   Java
# 2 1 Python
# 3 1   Ruby
# 4 2    104
# 5 2 109432
# 6 2     10
于 2018-03-07T23:24:29.857 回答