R中的进程记录器文件

时间:2013-05-03 01:01:24

标签: r logging

我在Ubuntu 12.10上使用R版本2.15.3(2013-03-01)和RStudio 0.97.312。 我正在尝试在R中创建一些记录器数据的直方图。但是,有些传感器并不总是有效,所以我得到了一些表中包含#N/AO/C的表。 这是日志的摘录:

Date    Time    Type    control.value (V)   light.barrier (V)   T hotplate ('C) T mesh ('C) T exhaust ('C)  T camera ('C)   Ref. Junction 1 ('C)

30.03.2012  13:47:50    Interval    0.001   23.556  411.0   O/C 30.5    35.1    23.14
30.03.2012  13:47:51    Interval    0.001   23.556  411.1   O/C 30.3    35.2    23.14
30.03.2012  13:47:52    Interval    0.001   23.556  411.1   O/C 30.2    35.5    23.14
30.03.2012  13:47:53    Interval    0.001   23.556  410.9   O/C 29.8    35.5    23.14
30.03.2012  13:47:54    Interval    0.001   23.556  410.9   O/C 30.1    35.3    23.14
30.03.2012  13:47:55    Interval    0.001   23.556  411.1   O/C 30.2    35.4    23.14
30.03.2012  13:47:56    Interval    0.001   23.556  410.8   O/C 29.8    35.4    23.14
30.03.2012  13:47:57    Interval    0.001   23.556  410.2   O/C 29.4    35.3    23.14
30.03.2012  13:47:58    Interval    0.001   23.556  409.5   O/C 29.1    35.0    23.14
30.03.2012  13:47:59    Interval    0.000   23.556  408.9   O/C 29.3    34.6    23.14
30.03.2012  13:48:00    Interval    0.000   23.556  408.7   O/C #N/A    #N/A    23.14

dput (head(logs), file = "dput.txt")的输出:http://pastebin.de/34176

R拒绝使用#N/AO/C处理列。我不能手工重新格式化,文件有185 000行。

当我加载日志并尝试创建直方图时:

> logs <- read.delim("../data/logger/logs/logs.txt", header=TRUE) 
> hist (logs$mesh)

我收到此错误消息:

Fehler in hist.default(logs$mesh) : 'x' muss nummerisch sein

粗略翻译(参见:How to change the locale of R in RStudio?):

Error in hist.default(logs$mesh) : 'x' must be numeric

我可以创建直方图的唯一列是sapply列出的数字列。所以我认为我必须删除这些无效值以获得数字值。

如何删除无效行?除了使用R处理它们之外,我也会采用其他方式,例如Perl或Python,如果它更适合这项任务。

这是加载日志后的sapply输出:

> sapply (logs, is.numeric)
     date          time          type control.value light.barrier      hotplate          mesh       exhaust 
    FALSE         FALSE         FALSE          TRUE         FALSE          TRUE         FALSE         FALSE 
   camera     reference 
    FALSE          TRUE 

#N/AO/C替换为NAhttps://stackoverflow.com/a/16350443/2333821)后

  logs.clean <- data.frame (check.rows = TRUE, apply(logs, 2, sub, pattern = "O/C|#N/A", replacement = NA))

我明白了:

> sapply (logs.clean, is.numeric)
     date          time          type control.value light.barrier      hotplate          mesh       exhaust 
    FALSE         FALSE         FALSE         FALSE         FALSE         FALSE         FALSE         FALSE 
   camera     reference
    FALSE         FALSE 

4 个答案:

答案 0 :(得分:1)

由于您已经特别询问了删除行的问题,以下是我的方法,下面是另一种选择。

#Makes some data
df <- data.frame(A = c("O/C", "#N/A", 1:3), B = c(4:6, "O/C", "#N/A"))
     # A    B
# 1  O/C    4
# 2 #N/A    5
# 3    1    6
# 4    2  O/C
# 5    3 #N/A

#Find rows that contain either value
remove <- apply(df, 1, function(row) any(row == "O/C" | row == "#N/A"))
#Subset using the negated index
df.rows <- df[!remove,]
#   A B
# 3 1 6

或者,您可以查找值并将其设置为NA,这不会删除行,但会允许大多数函数处理数据。

df.clean <- data.frame(apply(df, 2, sub, pattern = "O/C|#N/A", replacement = NA))

我使用data.frame()将所有内容快速转换为数字,可能有一种更优雅的方式来做...

答案 1 :(得分:1)

既然你写道,除了用R ....处理它们之外,你可以采用其他方式。

在常规终端窗口(不在R控制台中):

grep -v  '#N/A' log.txt > cleaned.txt

选项-v反转匹配,输出所有不匹配的行。

获取既没有#N/A又有O/C的所有行:

grep -v '#N/A\|O/C' log.txt > cleaned.txt

答案 2 :(得分:0)

read.table有助于删除评论字符后的任何内容。

注释字符由comment.char参数定义。

请参阅help(read.table)

当然,我只能猜测你正在使用read.table,因为你没有给我们提供示例代码或错误消息或什么也没有。

答案 3 :(得分:0)

这是一篇旧帖子,但由于我偶然发现,我会这样做以删除行:

df <- data.frame(A = c("O/C", "#N/A", 1:3), B = c(4:6, "O/C", "#N/A"))
#      A    B
# 1  O/C    4
# 2 #N/A    5
# 3    1    6
# 4    2  O/C
# 5    3 #N/A
cleandf <- df[!df$A %in% c("O/C", "#N/A") & !df$B %in% c("O/C", "#N/A"),]

使用条件选择数据帧的一个班轮