可能是一个简单的问题,但不确定如何短语/搜索它......
我正在分析我的网络服务器日志以使用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()感到不安。
如果您有兴趣,时间安排包括:
答案 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();
});