我在Ubuntu 12.10上使用R版本2.15.3(2013-03-01)和RStudio 0.97.312。
我正在尝试在R中创建一些记录器数据的直方图。但是,有些传感器并不总是有效,所以我得到了一些表中包含#N/A
和O/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/A
和O/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/A
和O/C
替换为NA
(https://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
答案 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"),]
使用条件选择数据帧的一个班轮