【问题标题】:Create new column with matching JSON part创建具有匹配 JSON 部分的新列
【发布时间】:2016-10-17 14:13:00
【问题描述】:

我尝试将匹配的 JSON 部分从列“数据”提取到新列“地理”中。此代码仅正确提取第一行,然后重复自身。我希望 'geo' 列显示为:

GEO 斯德哥尔摩、GEO 纽约、GEO 马德里、GEO 伦敦

而不是当前

GEO 斯德哥尔摩,GEO 斯德哥尔摩,GEO 斯德哥尔摩,GEO 斯德哥尔摩

代码:

library(rjson)
data <- c('["GEO STOCKHOLM","TYPE LOW"]','["GEO NEW YORK","TYPE MEDIUM"]','["GEO MADRID","TYPE HIGH"]','["GEO LONDON","TYPE MAX"]')
df <- data.frame(data, stringsAsFactors=FALSE)
df$geo <- grep("GEO", fromJSON(df$data), value = TRUE)

如您所见,我只想将 'geo' 部分保留在分号内,而丢失 'type' 部分。查看 df 数据框,这是我的(不正确的)输出:

Incorrect output df dataframe

【问题讨论】:

  • 看看fromJSON(df$data) 产生了什么。它只是遍历 GEOM STOCKHOLM 和 TYPE LOW。
  • 不是真正的莱昂纳多,不过谢谢。问题似乎是 grep 函数由于某种原因没有遍历 df$data 列?它似乎只是正确地提取了第一个元素,然后重复自身。
  • 这就是 Roman,fromJSON(df$data) 只是给了我这样的第一组:[1]“GEO STOCKHOLM”“TYPE LOW”。我希望它能给我所有四行。

标签: json r


【解决方案1】:

这个怎么样?

df$geo <- sapply(sapply(df$data, FUN = fromJSON, simplify = FALSE), FUN = "[", 1)

                            data           geo
1   ["GEO STOCKHOLM","TYPE LOW"] GEO STOCKHOLM
2 ["GEO NEW YORK","TYPE MEDIUM"]  GEO NEW YORK
3     ["GEO MADRID","TYPE HIGH"]    GEO MADRID
4      ["GEO LONDON","TYPE MAX"]    GEO LONDON

【讨论】:

  • 关闭谢谢,但它所做的只是插入两个元素中的第一个。顺序可能不同,因此它需要识别元素中何时出现术语“GEO”并提取它。
【解决方案2】:

谢谢大家,我最终构建了自己的函数:

getJSON <- function(x) {
result <- grep("GEO", rjson::fromJSON(x), value = TRUE)
return(result)

}

然后:

df$geo <- sapply(df$data, getJSON)

通过这种方式,我可以捕获所有“地理”元素,无论元素的数量或它们的顺序如何。您的意见帮助我最终实现了目标。谢谢。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2023-03-29
    • 2023-03-18
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多