【发布时间】:2015-09-15 04:51:06
【问题描述】:
我有一些我想要解析的 perfmon(Windows 性能日志数据)数据。
通常一组列名如下所示:
> colnames(p)
[1] "Time"
[2] "\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Queue Length"
[3] "\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Read Queue Length"
[4] "\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Write Queue Length"
[5] "\\\\testdb1\\Processor(_Total)\\% Processor Time"
[6] "\\\\testdb1\\System\\Processes"
[7] "\\\\testdb1\\System\\Processor Queue Length"
我将这些数据输入 R 的方式是:
p <- read.csv("r-perfmon.csv",stringsAsFactors = FALSE, check.names = FALSE)
这是一些示例数据
> head(p)
Time \\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Queue Length
1 04/15/2013 00:00:19.279 0.040037563
2 04/15/2013 00:00:34.279 0.009740260
3 04/15/2013 00:00:49.275 0.011009828
4 04/15/2013 00:01:04.284 0.006016244
5 04/15/2013 00:01:19.279 0.015125328
6 04/15/2013 00:01:34.275 0.002814141
\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Read Queue Length
1 0.001421333
2 0.000000000
3 0.000206726
4 0.000000000
5 0.001894000
6 0.000000000
\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Write Queue Length
1 0.038616230
2 0.009740260
3 0.010803102
4 0.006016244
5 0.013231327
6 0.002814141
\\\\testdb1\\Processor(_Total)\\% Processor Time \\\\testdb1\\System\\Processes
1 29.569339 86
2 10.856994 86
3 7.733924 81
4 1.910202 81
5 6.164864 81
6 1.351883 81
\\\\testdb1\\System\\Processor Queue Length
1 0
2 0
3 0
4 0
5 0
6 0
我希望能够解析列名然后融合数据。
所以如果我们以一列数据为例
> example <- p[2]
> head(example)
\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Queue Length
1 0.040037563
2 0.009740260
3 0.011009828
4 0.006016244
5 0.015125328
6 0.002814141
我希望它看起来像这样
Time, MachineName, Object, Counter, InstanceName, Value
04/15/2013 00:00:19.279, testdb1, PhysicalDisk, Avg. Disk Queue Length, 0 C:, 0.040037563
04/15/2013 00:00:34.279, testdb1, PhysicalDisk, Avg. Disk Queue Length, 0 C:, 0.009740260
04/15/2013 00:00:49.275, testdb1, PhysicalDisk, Avg. Disk Queue Length, 0 C:, 0.011009828
编辑:根据要求提供我的数据头部的 dput
structure(list(`(PDH-CSV 4.0) (GMT Daylight Time)(-60)` = c("04/15/2013 00:00:19.279",
"04/15/2013 00:00:34.279", "04/15/2013 00:00:49.275", "04/15/2013 00:01:04.284",
"04/15/2013 00:01:19.279", "04/15/2013 00:01:34.275"), `\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Queue Length` = c(0.040037563,
0.00974026, 0.011009828, 0.006016244, 0.015125328, 0.002814141
), `\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Read Queue Length` = c(0.001421333,
0, 0.000206726, 0, 0.001894, 0), `\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Write Queue Length` = c(0.03861623,
0.00974026, 0.010803102, 0.006016244, 0.013231327, 0.002814141
), `\\\\testdb1\\Processor(_Total)\\% Processor Time` = c(29.56933862,
10.85699395, 7.733924001, 1.910202013, 6.164864178, 1.351882837
), `\\\\testdb1\\System\\Processes` = c(86L, 86L, 81L, 81L, 81L,
81L), `\\\\testdb1\\System\\Processor Queue Length` = c(0L, 0L, 0L,
0L, 0L, 0L)), .Names = c("(PDH-CSV 4.0) (GMT Daylight Time)(-60)",
"\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Queue Length", "\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Read Queue Length",
"\\\\testdb1\\PhysicalDisk(0 C:)\\Avg. Disk Write Queue Length",
"\\\\testdb1\\Processor(_Total)\\% Processor Time", "\\\\testdb1\\System\\Processes",
"\\\\testdb1\\System\\Processor Queue Length"), row.names = c(NA,
6L), class = "data.frame")
【问题讨论】:
-
首先在 r 中使用
reshape将数据重新整形为长格式,然后在最后的列名上使用strsplit。如果您希望其他人复制您的数据,您还需要dput您的数据。 -
我有长格式
p <- melt(p, id=c("time"))但我正在努力解决 strsplit -
在宽格式中,您可以一次更改每一列...但我不确定最终数据集的外观。但是对于您的示例..
s <- strsplit(colnames(example), "\\\\|\\)|\\(")[[1]] ; data.frame(t(s[nzchar(s)]), example[[1]]) -
根据要求,我已经包含了我的数据头部的 dput
-
Gauss...感谢您的编辑,但您能否将问题中的
dput复制到新的 R 会话中?由于单个反斜杠,它给我抛出了一个错误
标签: r string data-cleaning