Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 通过解析R中的字符向量来构建数据帧_Regex_R - Fatal编程技术网

Regex 通过解析R中的字符向量来构建数据帧

Regex 通过解析R中的字符向量来构建数据帧,regex,r,Regex,R,我是R的新手,正在努力从博物馆的藏品中构建数据集 在抓取他们的网站后,我有一个字符向量列表,比如说名称是特征,其中每个元素如下所示: [[4729]] [1] " Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gif

我是R的新手,正在努力从博物馆的藏品中构建数据集

在抓取他们的网站后,我有一个字符向量列表,比如说名称是特征,其中每个元素如下所示:

[[4729]]
[1] " Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto"
     year    medium           dimensions    credit line    number
1   2002     Pencil on paper   etc...
根据这些向量,我想制作一个如下所示的数据帧:

[[4729]]
[1] " Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto"
     year    medium           dimensions    credit line    number
1   2002     Pencil on paper   etc...
然而,我似乎无法设法从字符向量中减去必要的数据,因为我正在努力使用正则表达式来做到这一点。我们的想法是在Date://之后和Medium://之前获取数据。更复杂的是,并非列表中的每个元素都具有相同顺序的相同特征,例如,一些元素只有日期和介质,而其他元素包括版本://、通过://获取等

只需保存每个列表元素的前4位数字,就可以很容易地编制年份列表:

year <- list()

for(p in 1:length(characteristics)) {
  string <- as.character(characteristics[p])
  year <- c(year, str_extract(string, "\\d\\d\\d\\d"))
  }
这可能不是最快的方法,但它做得很好。 但是,我完全无法从列表中提取其他变量。

也许旧的read.table也是一个选项:

txt <- c("Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto",
         "Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto")
read.table(text = gsub("( Credit)?\\s?[A-z]+://", "\t", txt), sep = "\t", quote = "", col.names = letters[1:7])[-1]
#      b               c                                 d                                                                           e      f                        g
# 1 2002 Pencil on paper 22 1/2 x 30 1/8" (57.2 x 76.5 cm) The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA 1563.2 © 2015 Steve DiBenedetto
# 2 2002 Pencil on paper 22 1/2 x 30 1/8" (57.2 x 76.5 cm) The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA 1563.2 © 2015 Steve DiBenedetto

是否允许使用awk或其他方法进行预处理?您可以提取字符串,然后使用gsub删除第一个匹配部分。。每个步骤都匹配此正则表达式:[a-zA-Z]*:\/\/\[^\/]*\[a-zA-Z]*\/\/。请注意,此正则表达式使用sed语法。有一个组捕获,其中包含您想要的信息,请使用\1或\\1我相信R访问它。您知道特征范围的可用选项吗?这正接近@lukeA!但是,一些问题仍然存在:我们丢失了有关正在保存的特征的信息,例如介质。不同的艺术品有不同的特征,所以我应该能够将特征保存在正确的列名下。因此,我们存储的信息应该存储在一个名为的列中,该列的字符串位于://例如medium之前。我没有像这里提到的@Anando Mahto那样列出一系列特征。每当我们在://前面遇到一个新标记时,都应该使用该名称创建一个新列。