在R

时间:2016-01-04 11:42:22

标签: r

可能是一个简单的问题,但不确定如何短语/搜索它......

我正在分析我的网络服务器日志以使用R来检查性能:

data = read.table("/path/to/log", sep=" ")

这些日志包括URL,整体处理时间以及每个请求期间某些操作所花费的时间(例如DNS查找,我无法控制)。

对于一个减少的例子:

time   path   info_extra
0.0027 /test/ -
0.0080 /test/ DNSMX=0
0.0218 /test/ DNSMX=0
0.0314 /test/ -
0.2442 /test/ DNSMX=0,PASSH=0.14
0.3962 /test/ DNSMX=0,PASSH=0.159,GEO=0.12
0.4500 /test/ DNSMX=0.018,DNSMX=0.037,PASSH=0.14,GEO=0.133

如何轻松地分割info_extra值(以逗号分隔的字符串),并从time值中减去等号后面的值?

例如:

time   local  path   info_extra
0.0027 0.0027 /test/ -
0.0080 0.0080 /test/ DNSMX=0
0.0218 0.0218 /test/ DNSMX=0
0.0314 0.0314 /test/ -
0.2442 0.1042 /test/ DNSMX=0,PASSH=0.14
0.3962 0.1172 /test/ DNSMX=0,PASSH=0.159,GEO=0.12
0.4500 0.1220 /test/ DNSMX=0.018,DNSMX=0.037,PASSH=0.14,GEO=0.133

我可能会让这有点棘手,因为info_extra最初是从info字段中提取的,该字段还存储用斜杠分隔的用户和管理员ID:

        time                                             info path  
6238  0.0027                                            0/0/- /test/
16940 0.4500 0/0/DNSMX=0.018,DNSMX=0.037,PASSH=0.14,GEO=0.133 /test/
17151 0.0314                                            0/0/- /test/
17162 0.2442                           0/0/DNSMX=0,PASSH=0.14 /test/
23112 0.3962                 0/0/DNSMX=0,PASSH=0.159,GEO=0.12 /test/
30400 0.0080                                  12035/0/DNSMX=0 /test/
39649 0.0218                                  11340/0/DNSMX=0 /test/

info = data.frame(do.call(rbind, strsplit(data$info, "/")));
names(info) <- c("user_id", "admin_id", "info_extra");
data = cbind(data, info);

所以我认为extra_info目前是Factor,这似乎让strsplit()感到不安。

如果您有兴趣,时间安排包括:

  • DNSMX:DNS检查电子邮件地址域是否有效。
  • DNSA:再次相同,但在A记录上(如果MX失败)。
  • PASSH:哈希密码(故意慢,参考bcrypt)。
  • GEO:从第三方服务器获取GeoCords地址。
  • SESS:等待会话锁打开。

2 个答案:

答案 0 :(得分:2)

我建议使用data.table包。

library(data.table)
dt <- as.data.table(data)

tmp <- dt[, tstrsplit(info, '/')]
tmp <- tmp[, tstrsplit(V3, ',')]
out <- tmp[, lapply(.SD, function(x) unlist(lapply(strsplit(x, '='), function(y) as.numeric(y[2]))))]

首先lapply获取data.table的每一列。第二个lapply用于在第二个位置获取值(strsplit返回一个列表)。然后减法很简单dt[, time - out]

答案 1 :(得分:1)

我不是管道的忠实粉丝,但这里说明了我将采取的解决这个问题的步骤。

请参阅每个步骤中发生的事情的评论。

mydf <- structure(list(time = c(0.0027, 0.45, 0.0314, 0.2442, 0.3962, 
    0.008, 0.0218), info = c("0/0/-", "0/0/DNSMX=0.018,DNSMX=0.037,PASSH=0.14,GEO=0.133", 
    "0/0/-", "0/0/DNSMX=0,PASSH=0.14", "0/0/DNSMX=0,PASSH=0.159,GEO=0.12", 
    "12035/0/DNSMX=0", "11340/0/DNSMX=0"), path = c("/test/", "/test/", 
    "/test/", "/test/", "/test/", "/test/", "/test/")), .Names = c("time", 
    "info", "path"), row.names = c("6238", "16940", "17151", "17162", 
    "23112", "30400", "39649"), class = "data.frame")

以下是此答案中使用的示例数据:

$('.sub-lang ul li').on('click', function(e) {
  e.stopPropagation();
});