【问题标题】:Breaking up column of strings into multiple columns (no standard format)?将字符串列分成多列(无标准格式)?
【发布时间】:2021-07-16 18:34:55
【问题描述】:

我有一个已导入 R 的 excel 文件。问题是有超过 100,000 行的数据在单个单元格中如下所示:

{'gender': 'Male', 'nationality': 'IRL', 'document_type': 'passport', 'date_of_expiry': '2019-08-12', 'issueing_country': 'IRL'}

所以发生的情况是,R 也将整个信息放入了我表中的一个框中。我希望 R 将这一列分成多个列,例如“性别”、“国籍”、“文档类型”等。每个列都有自己的列,分别包含“男性”、“IRL”、“护照”等条目排。问题是在其他单元格中遗漏了一些信息,例如另一个单元格可能如下所示:

{'gender': 'Female', 'document_type': 'driving_licence', 'date_of_expiry': '2023-02-28', 'issueing_country': 'GBR'}

还有一个这样的:

{'document_type': 'driving_licence', 'date_of_expiry': '2044-12-14', 'issuing_country': 'GRC'}

如何将这些条目分配给它们自己的列,并且在未提供任何信息的情况下具有空值。我是初学者 R 用户。我曾尝试使用包“qdapRegex”,因为他们有一个方便的工具,我可以在其中提取其他两个字符/字符串之间的字符,但无济于事。我想如果我能弄清楚如何应用像'|'这样的运算符到字符串我可以用我的方式做到这一点。

输入后:

input <- read.csv(text=r"(
ID, Properties
1,"{'gender': 'Male', 'nationality': 'IRL', 'document_type': 'passport', 'date_of_expiry': '2019-08-12', 'issuing_country': 'IRL'}"
2,"{'document_type': 'national_identity_card', 'date_of_expiry': '2027-01-23', 'issuing_country': 'CYP'}"
3,"{'date_of_expiry': '2019-01-28', 'issuing_country': 'JEY'}"
4,"{'document_type': 'driving_licence', 'date_of_expiry': '2006-06-14', 'issuing_country': 'POL'})")

期望的输出:

output <- read.csv(text="
ID,gender,nationality,document_type,date_of_expiry,issuing_country
1,Male,IRL,passport,2019-08-12,IRL
2,,,national_identity_card,2027-01-23,CYP
3,,,,2019-01-28,JEY
4,,,driving_licence,2006-06-14,POL
")

【问题讨论】:

  • 看起来你有一列 JSON 数据。 R 中有 JSON 解析器可以提供帮助。如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • @MrFlick 我做了一些修改,可以吗?
  • 那好多了,我把数据变成了合适的 R 对象。所有这些管道和破折号仍然难以复制/粘贴到 R 中进行测试。我们正在努力避免为了测试代码而不得不重新输入一堆东西。
  • 啊,我明白了,谢谢您的修改。

标签: r


【解决方案1】:

所以您的数据非常类似于 JSON。唯一的“问题”是它使用单引号而不是双引号。如果我们交换引号,我们可以更容易地解析数据。这是一些使用一些帮助包来完成​​工作的代码

library(purrr)
library(dplyr)
library(jsonlite)
library(tidyr)

input %>% 
  mutate(Properties = gsub("'", "\"", Properties)) %>% 
  mutate(Properties = map(Properties, fromJSON)) %>% 
  unnest_wider(Properties)

#      ID gender nationality document_type          date_of_expiry issuing_country
#   <int> <chr>  <chr>       <chr>                  <chr>          <chr>          
# 1     1 Male   IRL         passport               2019-08-12     IRL            
# 2     2 NA     NA          national_identity_card 2027-01-23     CYP            
# 3     3 NA     NA          NA                     2019-01-28     JEY            
# 4     4 NA     NA          driving_licence        2006-06-14     POL 

当我们解析 JOSN 时,我们会得到一个命名的值列表。 tidyr::unnest_wider 函数会将值列表转换为列。

【讨论】:

  • 错误:mutate()properties 有问题。我properties = map(properties, fromJSON)。 x 词法错误:json 文本中的无效字符。 {“性别”:无,“发布日期”:“2007-07-
  • 这是我收到的错误,不幸的是我对 JOSN 文本不太熟悉,但错误似乎与条目 None 我认为可能是它周围不包含语音标记的事实
  • 是的,“无”不是有效的 JSON 令牌。缺失值应为“null”。这些数据来自哪里?看起来这些是奇怪的原始 python dict 对象。我不明白这将如何在 Excel 文档中结束。
  • 我只有这个excel文件,我想对它进行一些统计分析。是否可以用 null 替换此列中 none 的每个实例并重新运行代码?
  • 这似乎是可能的。我建议你试试。如果没有可重现的示例,我很难进行测试。
猜你喜欢
  • 2020-03-28
  • 2021-08-20
  • 2021-02-19
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2013-12-14
  • 2019-09-10
相关资源
最近更新 更多