【问题标题】:A follow-up to "Extracting data from an API using R"“使用 R 从 API 中提取数据”的后续内容
【发布时间】:2019-07-05 10:53:06
【问题描述】:

我的代码(来自A continuation of... Extracting data from an API using R)给出了一个非常复杂的输出。除了嵌套在列表中的 data.frame 之外,我几乎可以提取所有我需要的东西。

什么都不做,它给了我这个错误:

.rowNamesDF<-(x, value = value) 中的错误: 不允许重复的“row.names” 另外:警告信息: 设置“row.names”时的非唯一值:“1”、“10”、“11”、“12”、“13”、“14”、“15”、“16”、“17”、“18” ', '19', '2', '20', '3', '4', '5', '6', '7', '8', '9'

如果我尝试展平或取消列出,它会出现 NULL。

在示例代码中,我添加了一些易于获取的变量,数字 42 是“dokintressent”,我需要从中获取“intressent”,即每个案例的名称列表。我必须运行瑞典立法机构的 API 六次,但这是比较棘手的一次。

当我删除 42 时,它使 data.frame 完美。

my_dfs1 <- lapply(1:207, function(i){
  my_url <- paste0("http://data.riksdagen.se/dokumentlista/?sok=&doktyp=mot&rm=&from=2017-01-01&tom=2017-12-31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s&p=", i)
  r1 <- GET(my_url)
  r2 <- rawToChar(r1$content)
  r3 <- fromJSON(r2)
  r4 <- r3$dokumentlista$dokument
  return(r4)
})

df <- my_dfs1 %>% lapply(function(df_0){
  df_0[c(12:14, 18, 42)]
}) %>% do.call(rbind, .)

编辑:我注意到我想要的数据实际上是每个案例的几个 data.frames。从“ingressent”,我需要“namn”。基本上,我需要最终的数据库看起来像这样:

                     V12     V13    V14    V18    Namn
    Motion 1                                     c(name1, name2)

【问题讨论】:

  • 问题是只有你可以决定数据应该如何表示,或者更确切地说是你想要的。 intressent 每行有一个数据框,这个数据框如何适合原始数据框(又名df_0 在上面的代码中)?你如何想象你想要得到的最终结果?例如,您是否要为 intressent 中的行重复 df_0[c(12:14, 18]) 中的每一行?
  • 我要编辑这个问题,因为我也意识到每行的 data.frame 问题。我真正需要的是“namn”,如果它可以作为一个列出现,每个单元格都反映一个名称列表,那就太好了。我需要所有这些都成为一个我以后可以使用的单一数据库。非常感谢你这样做。我绝对咬得比我能咀嚼的多。

标签: r json list dataframe extraction


【解决方案1】:

您需要自己处理intressent 并从中提取您需要的内容,然后将其分配给一个新列,只要确保每行都有一个简单的数据结构即可。

如果它更适合您,您也可以将名称粘贴在一起,例如用“-”分隔,然后intressent 将是一个简单的字符向量。

df <- my_dfs1 %>% lapply(function(df_0){
  #choose the columns you want
  return_df <- df_0[c(12:14, 18)]
  # work on intressent
  return_df$namn <- df_0$dokintressent$intressent %>% 
    lapply(function(x)list(x$namn)) %>% 
    do.call(rbind, .)                    # careful here a simple unlist won't work
  return(return_df) }) %>% 
  do.call(rbind, .)

【讨论】:

  • 我想过——它应该独立工作——但我不知道从哪里开始。很抱歉问,因为我确定您已经考虑过这一点,但最终他们会被分配回正确的案例吗?谁与谁一起工作是我的主要假设之一。
  • 我运行了几次,它以列表的形式返回,使用了所有可能的列 - 也许我遗漏了一些东西
  • 我不确定你的意思,例如如果你运行df$namn[1] %&gt;% str()会得到什么?
  • 我不知道我之前没有做错什么,但它现在可以工作了。它不是作为 data.frame 而是作为一个大矩阵返回。很抱歉一直打扰你,如果你愿意的话,我很乐意给你适当的信任(除了感谢你在我的致谢中使用你的句柄)。
  • 那很好!这一点也不麻烦,我很乐意提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多