改进R代码,用正则表达式获取数字

UDE*_*ent 6 r

我想将ping时间绘制到特定服务器,因此我正在解析此String的输出:

[1] "PING google.de (216.58.213.195): 56 data bytes"                
[2] "64 bytes from 216.58.213.195: icmp_seq=0 ttl=58 time=15.583 ms"
[3] "64 bytes from 216.58.213.195: icmp_seq=1 ttl=58 time=11.057 ms"
[4] "64 bytes from 216.58.213.195: icmp_seq=2 ttl=58 time=10.866 ms"
[5] ""                                                              
[6] "--- google.de ping statistics ---"                             
[7] "3 packets transmitted, 3 packets received, 0.0% packet loss"   
[8] "round-trip min/avg/max/stddev = 10.866/12.502/15.583/2.180 ms" 
Run Code Online (Sandbox Code Playgroud)

我正在使用正则表达式并搜索'time ='和'ms'来获取时间信息开始和结束的位置.然后我使用Substr来提取数字.实际上它有效,但这是我第一次尝试解析R中的字符串,我的感觉是我的解决方案可能更优雅.你可以帮帮我吗?TY

X <- system("ping -c 3 google.de",intern=TRUE)
start<-regexpr("time=",X)
end<-regexpr(" ms",X)
start<-start+5
end<-end-1

erg<-substr(X,start,end)
erg<-erg[2:4]
erg

erg<-as.numeric(erg)

hist(erg)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以str_extract用来提取数字

library(stringr)
na.omit(as.numeric(str_extract(X, '(?<=time=)[0-9.]+(?=\\s*ms)')))
#[1] 15.583 11.057 10.866
Run Code Online (Sandbox Code Playgroud)

数据

X <- c("PING google.de (216.58.213.195): 56 data bytes", 
"64 bytes from 216.58.213.195: icmp_seq=0 ttl=58 time=15.583 ms", 
"64 bytes from 216.58.213.195: icmp_seq=1 ttl=58 time=11.057 ms", 
"64 bytes from 216.58.213.195: icmp_seq=2 ttl=58 time=10.866 ms", 
"", "--- google.de ping statistics ---", 
"3 packets transmitted, 3 packets received, 0.0% packet loss", 
"round-trip min/avg/max/stddev = 10.866/12.502/15.583/2.180 ms")
Run Code Online (Sandbox Code Playgroud)