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

时间:2015-11-03 18:11:08

标签: 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" 

我正在使用正则表达式并搜索' 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)

2 个答案:

答案 0 :(得分:6)

我们可以使用str_extract来提取数字

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

数据

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")

答案 1 :(得分:4)

使用您当前的向量b,您可以尝试X获取相关的行,然后grep()来获取时间。以下数字与您的数字不同,因为我运行代码的第一行来指定gsub()

X

但是,由于您已经通过tms <- grep("time=", X, fixed = TRUE, value = TRUE) as.numeric(gsub(".*time=(\\d+.?\\d+).*", "\\1", tms)) # [1] 19.7 21.3 162.0 调用获取了ping数据,因此您也可以尝试从命令行执行其余的工作。

system()

或者您可以使用X <- as.numeric(system( "ping -c 3 google.de | grep time= | cut -d '=' -f 4 | cut -d ' ' -f 1", intern = TRUE )) X # [1] 29.2 17.8 23.8 而不是两次awk来电。

cut

另一个选项是as.numeric(system( "ping -c 3 -n google.de | grep time= | awk -F '=| ' '{ print $10 }'", intern = TRUE )) # [1] 23.4 19.6 29.3 ,但我会留下一个给你。