R 如何在文本中按时间顺序搜索某些元素以创建简化的数据框架
数据简介 我有一个文本文件或csv,其中包含一个网站的编码,在那里我无法将数据导出到excel工作表。这意味着数据本身是一堆代码,其中元素由特定的文本位区分 了解数据 外汇。每个变量都以R 如何在文本中按时间顺序搜索某些元素以创建简化的数据框架,r,string,function,loops,apply,R,String,Function,Loops,Apply,数据简介 我有一个文本文件或csv,其中包含一个网站的编码,在那里我无法将数据导出到excel工作表。这意味着数据本身是一堆代码,其中元素由特定的文本位区分 了解数据 外汇。每个变量都以开头。变量x中的每个元素都有一个以… y有一个以..开头的代码,其中该元素的值以开头。 每个变量的编码以及与此变量相关的底层代码以开头 数据结构 So the structure of the file is as following: `<a:PLI>` <a:DT&g
开头。变量x中的每个元素都有一个以…
y有一个以..
开头的代码,其中该元素的值以
开头。
每个变量的编码以及与此变量相关的底层代码以
开头
数据结构
So the structure of the file is as following:
`<a:PLI>`
<a:DT>...
`<a:FN>...`
`<a:KY>...`
<a:VL>...
`<a:PLI>`
<a:DT>...
`<a:FN>...`
`<a:KY>...`
<a:VL>...
因此文件的结构如下所示:
``
...
`...`
`...`
...
``
...
`...`
`...`
...
导入到R时,dataframe只有一列,总共约35.000行。每一位代码都有自己的行
我希望做什么和预期结果
我想做的是将这个复杂的文本文件转换成一个新的数据框架,其中包含我感兴趣的所有元素
例如,对于每个组/变量(a(很抱歉,前面的回答错误,我错过了你问题的一个重要部分)
以下是我将如何做到这一点:
将文本包装在一对标记中,使其成为有效的xml(即,添加根节点)
删除所有“a:”(命名空间前缀)
然后,在R中:
library(xml2)
foo <- read_xml("tmp.xml")
# convert to a nodeset
allplis <- xml_find_all(foo, "//PLI")
xtractpli <- function(x) {
dt <- xml_text(xml_find_first(x, "DT"))
fn <- xml_text(xml_find_first(x, "FN"))
orgkey <- xml_find_first(x, "PSPS/PSP[KY='org-key']")
orgkey <- xml_text(xml_find_first(orgkey, "VL"))
return(c(fn, dt, orgkey))
}
t(sapply(allplis, xtractpli))
这就是你想要的吗?(很抱歉之前的错误答案,我错过了你问题的一个重要部分)
以下是我将如何做到这一点:
将文本包装在一对标记中,使其成为有效的xml(即,添加根节点)
删除所有“a:”(命名空间前缀)
然后,在R中:
library(xml2)
foo <- read_xml("tmp.xml")
# convert to a nodeset
allplis <- xml_find_all(foo, "//PLI")
xtractpli <- function(x) {
dt <- xml_text(xml_find_first(x, "DT"))
fn <- xml_text(xml_find_first(x, "FN"))
orgkey <- xml_find_first(x, "PSPS/PSP[KY='org-key']")
orgkey <- xml_text(xml_find_first(orgkey, "VL"))
return(c(fn, dt, orgkey))
}
t(sapply(allplis, xtractpli))
这就是您想要的吗?您实际上是在处理一种XML,其中:
之前的a
被称为其“名称空间”。假设其余数据与您提供的示例类似,您可以使用类似以下代码的方式提取数据,其中s
是您提供的数据(您需要将s
替换为您的文件名):
库(rvest)
图书馆(purrr)
图书馆(dplyr)
变量%
html_节点(“pli”)%>%
取消分类()%>%
map_df(~map2(列表(.)、变量、~html_文本(html_节点(.x,.y)))%>%
设置\u名称(变量)%>%
作为_utible,,
.id=“pli”
)
我使用read_html
而不是read_xml
,因为在这种情况下,它可以很好地解析xml,而且我不想在名称空间中胡闹。我不能保证这会一直起作用。您的示例数据中似乎只有一个名称空间,所以您可能不会有问题
之后,我使用html\u节点
拉出三个pli
节点,然后使用unclass
将XML节点集转换为一个列表。在map\u df
中,我迭代三个列表元素(三个pli
节点),并应用map2
,其中我使用vars
中的值拉出所有相关节点,并将输出存储在一个TIBLE中。结果如下所示:
# A tibble: 8 x 8
pli dt dtr desc fn ti ky vl
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 False False text text text Type 80200 org-group 40100
2 1 False False text text text Type 80200 org-key 60205
3 1 False False text text text Type 80200 org-systemkey 1005
4 1 False False text text text Type 80200 org-report-type text text text
5 2 Room Room "" StartRoom 12500 org-group 13020
6 2 Room Room "" StartRoom 12500 org-key 13130
7 3 Other room Other room "" StartRoom 15552 org-group 11160
8 3 Other room Other room "" StartRoom 15552 org-key 15152
#一个tible:8 x 8
pli dt dtr desc fn ti ky vl
1 1 False False文本类型80200组织组40100
2 1错误文本类型80200组织密钥60205
3 1 False False文本类型80200组织系统密钥1005
4 1 False False文本类型80200组织报告类型文本
5 2房间“StartRoom 12500组织组13020
6 2房间“StartRoom 12500组织钥匙13130
7.3其他房间其他房间“StartRoom 15552组织组11160
8.3其他房间其他房间“StartRoom 15552组织钥匙15152
您实际上是在处理一种XML,其中:
之前的a
被称为其“名称空间”。假设其余数据与您提供的示例类似,您可以使用类似于以下代码的代码提取数据,其中s
是您提供的数据(您需要将s
替换为您的文件名):
库(rvest)
图书馆(purrr)
图书馆(dplyr)
变量%
html_节点(“pli”)%>%
取消分类()%>%
map_df(~map2(列表(.)、变量、~html_文本(html_节点(.x,.y)))%>%
设置\u名称(变量)%>%
作为_utible,,
.id=“pli”
)
我使用read_html
而不是read_xml
,因为在这种情况下,它可以很好地解析xml,而且我不想在名称空间中胡闹。我不能保证这会一直起作用。您的示例数据中似乎只有一个名称空间,所以您可能不会有问题
之后,我使用html\u节点
拉出三个pli
节点,然后使用unclass
将XML节点集转换为一个列表。在map\u df
中,我迭代三个列表元素(三个pli
节点),并应用map2
,其中我使用vars
中的值拉出所有相关节点,并将输出存储在一个TIBLE中。结果如下所示:
# A tibble: 8 x 8
pli dt dtr desc fn ti ky vl
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 False False text text text Type 80200 org-group 40100
2 1 False False text text text Type 80200 org-key 60205
3 1 False False text text text Type 80200 org-systemkey 1005
4 1 False False text text text Type 80200 org-report-type text text text
5 2 Room Room "" StartRoom 12500 org-group 13020
6 2 Room Room "" StartRoom 12500 org-key 13130
7 3 Other room Other room "" StartRoom 15552 org-group 11160
8 3 Other room Other room "" StartRoom 15552 org-key 15152
#一个tible:8 x 8
pli dt dtr desc fn ti ky vl
1 1 False False文本类型80200组织组40100
2 1
# A tibble: 8 x 8
pli dt dtr desc fn ti ky vl
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 False False text text text Type 80200 org-group 40100
2 1 False False text text text Type 80200 org-key 60205
3 1 False False text text text Type 80200 org-systemkey 1005
4 1 False False text text text Type 80200 org-report-type text text text
5 2 Room Room "" StartRoom 12500 org-group 13020
6 2 Room Room "" StartRoom 12500 org-key 13130
7 3 Other room Other room "" StartRoom 15552 org-group 11160
8 3 Other room Other room "" StartRoom 15552 org-key 15152