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