将字符串的列分解为多列(没有标准格式)

  • 本文关键字:标准 格式 字符串 分解 r
  • 更新时间 :
  • 英文 :


我有一个excel文件,我已经导入到R中。问题是,在一个单元格中,有超过100000行的数据看起来如下:

{‘ender’:‘Male’,‘nationality’:‘IRL’,‘document_type’:‘passport’,‘date_of_expiry’:‘2019-08-12’,‘issueing_country’:‘IRCL’}

因此,R还将整个信息放在我的表中的一个框中。我希望R将此单列拆分为多列,以便"性别"、"国籍"、"文档类型"等各有自己的列,此行分别包含条目"男性"、"IRL"、"护照"等。问题是在其他小区中遗漏了一些信息,例如,另一个小区可能看起来像这样:

{'ender':'Female','document_type':'driving_licence','date_of_expirth':'2023-02-28','issueing_country':'GBR'}

和另一个类似的:

{'document_type':'driving_licence','date_of_expirth':'2044-12-14','issueing_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。唯一的";"问题";它使用单引号而不是双引号。如果我们交换引号,我们可以更容易地解析数据。以下是一些使用一些辅助程序包来完成任务的代码

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函数将把该值列表转换为列。

最新更新