【问题标题】:R function to parseR函数解析
【发布时间】:2019-08-24 16:41:40
【问题描述】:

我正在使用 R,但在解析数据集中的列时遇到问题。列名称为read_data,每一行的值如下: "val":"O;P;Q8;S"}] 我想解析这个并能够在单独的列中获得 O、P、Q8 和 S。 有人可以帮我解决这个问题吗?

该列具有来自 JSON 的值,如下所示:

    "val":"O;P;Q8;S"}]
    "val":"P;V;I9;J"}]
    "val":"Z;A;G8;N"}]


    Expected Output:
    O P Q8 S
    P V I9 J
    Z A G8 N

【问题讨论】:

  • 能否请您展示一个可重现的小示例和预期输出
  • 您的数据是表格形式吗?如果是这样,您可以发布示例数据吗?请使用dput(df[, colname]) 的输出编辑问题。或者,如果 dput(head(df[, colname], 20)) 的输出太大。
  • 另见this question
  • 如果是JSON,[{在哪里
  • 欢迎来到 Stackoverflow。请按照以下说明提出一个好问题:stackoverflow.com/help/minimal-reproducible-example

标签: r parsing


【解决方案1】:

一种选择是使用fromJSON 提取内容,并使用read.csv/read.table 读取

library(jsonlite)
read.table(text = paste(sapply(paste0('{', sub("\\]", "",  df1$col)),
    function(x) fromJSON(x)$val), collapse="\n"), header = FALSE, sep=";")
#  V1 V2 V3 V4
#1  O  P Q8  S
#2  P  V I9  J
#3  Z  A G8  N

或者另一个选项是base R,我们提取:之后的字符而不是}[^}]+),在删除双引号( ") 和gsub,然后通过将sep 指定为;headerFALSE 来使用read.table/read.csv

v1 <- paste(gsub('"', "", regmatches(df1$col, regexpr("(?<=:)[^}]+", 
    df1$col, perl = TRUE))), collapse="\n")
read.table(text = v1, header = FALSE, sep = ";")
#  V1 V2 V3 V4
#1  O  P Q8  S
#2  P  V I9  J
#3  Z  A G8  N

数据

df1 <- structure(list(col = c("\"val\":\"O;P;Q8;S\"}]", "\"val\":\"P;V;I9;J\"}]", 
"\"val\":\"Z;A;G8;N\"}]")), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • 非常感谢您的回复。我仍在单独搜索,应用功能等来解决。我将检查并学习您使用的功能。非常感谢:)
  • @SandhyaSuresh 没问题。我添加了一些解释。希望对理解有帮助
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多