如何在保留特定项目的同时消除数据

时间:2019-02-08 21:39:38

标签: r xml

我正在尝试清除ECG的输出,以进一步分析心率变异性。具体来说,我需要从文本文件中删除所有内容,但单词“ start”之间的数字除外,因此剩下的唯一内容就是一列数字。

以下是输出示例:

<EMSE_Event_List>
<bSaveNotation>0</bSaveNotation>
<sQID></sQID>
<bUseQID>1</bUseQID>
<Event><Name>[seg]</Name><Start>0</Start><Stop>0</Stop>  
<Status>1</Status><Color>255</Color><Attribute>0</Attribute>  
<TimeStart>0</TimeStart><TimeStop>0</TimeStop>  
<FreqStart>0</FreqStart><FreqStop>0</FreqStop>  
<FWHM_Time>0</FWHM_Time><FWHM_Freq>0</FWHM_Freq></Event>
<Event><Name>R</Name><Start>186</Start><Stop>186</Stop>  
<Status>2</Status><Color>255</Color><Attribute>0</Attribute>  
<TimeStart>0</TimeStart><TimeStop>0</TimeStop> 
<FreqStart>0</FreqStart><FreqStop>0</FreqStop>

4 个答案:

答案 0 :(得分:1)

这是标准xml格式。解决此问题的最佳方法是使用XML解析器工具。 XMLxml2是两个流行的软件包/库。我更喜欢使用xml2库。
使用XML解析器,可以很容易地从仅请求的节点中提取值,而无需使用复杂的正则表达式语法。

text<-"<EMSE_Event_List>
<bSaveNotation>0</bSaveNotation>
<sQID></sQID>
<bUseQID>1</bUseQID>
<Event><Name>[seg]</Name><Start>0</Start><Stop>0</Stop>  
<Status>1</Status><Color>255</Color><Attribute>0</Attribute>  
<TimeStart>0</TimeStart><TimeStop>0</TimeStop>  
<FreqStart>0</FreqStart><FreqStop>0</FreqStop>  
<FWHM_Time>0</FWHM_Time><FWHM_Freq>0</FWHM_Freq></Event>
<Event><Name>R</Name><Start>186</Start><Stop>186</Stop> 
<Status>2</Status><Color>255</Color><Attribute>0</Attribute> 
<TimeStart>0</TimeStart><TimeStop>0</TimeStop> 
<FreqStart>0</FreqStart><FreqStop>0</FreqStop></Event></EMSE_Event_List>"

library(xml2)
page<-read_xml(text)
values<-xml_text(xml_find_all(page, "//Start"))
values<-as.numeric(values)
values

[1]   0 186

有关另一个示例,请参见此问题:get value from xml with r by attribute

答案 1 :(得分:0)

使用stringr库:

library(stringr)
str_extract_all(text,"(?<=<Start>)[0-9]+(?=</Start>)")

[[1]]
[1] "0"   "186"

但是xml2也应该可以正常工作

答案 2 :(得分:-1)

基于R的解决方案

s <- "<EMSE_Event_List>
<bSaveNotation>0</bSaveNotation>
<sQID></sQID>
<bUseQID>1</bUseQID>
<Event><Name>[seg]</Name><Start>0</Start><Stop>0</Stop> . 
<Status>1</Status><Color>255</Color><Attribute>0</Attribute> . 
<TimeStart>0</TimeStart><TimeStop>0</TimeStop> . 
<FreqStart>0</FreqStart><FreqStop>0</FreqStop> . 
<FWHM_Time>0</FWHM_Time><FWHM_Freq>0</FWHM_Freq></Event>
<Event><Name>R</Name><Start>186</Start><Stop>186</Stop> . 
<Status>2</Status><Color>255</Color><Attribute>0</Attribute> . 
<TimeStart>0</TimeStart><TimeStop>0</TimeStop> 
<FreqStart>0</FreqStart><FreqStop>0</FreqStop>"

start <- unlist(gregexpr(pattern ="<Start>",s)) + 7
end <- unlist(gregexpr(pattern ="</Start>",s)) - 1
unname(mapply(substr, x=s, start=start, stop=end))  
[1] "0"   "186"

要开始添加的偏移量/减去要开始的偏移量。添加结尾以不包含匹配的字符串。

答案 3 :(得分:-1)

您将为此使用正则表达式。

John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right.