2013-05-03 23 views
1

我在Ubuntu 12.10上使用R版本2.15.3(2013-03-01)和RStudio 0.97.312。 我試圖在R中創建一些記錄器數據的直方圖。但是,一些傳感器並不總是工作,所以我得到了一些其中#N/AO/C的表格。 這裏是日誌的摘錄:R中的進程記錄器文件

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列出的數字列。所以我想我必須刪除這些無效值才能得到數字。

如何刪除無效行?我也願意用其他方式處理它們,例如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 

NAhttps://stackoverflow.com/a/16350443/2333821

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

更換#N/AO/C後,我得到這個:

> 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

你是什麼意思「處理「?你能運行'dput(head(DF))'哪裏'DF'是你的data.frame並且在這裏發佈結果? – 2013-05-03 01:11:55

+0

如果要刪除這些行,請查看'?subset'並構造一個邏輯參數以排除這些行,例如'myvar!=「O/C&myothervar!=」#N/A「'。 – Frank 2013-05-03 01:18:32

+0

投票拒絕因爲沒有代碼,沒有錯誤信息,也沒有關於「R拒絕處理這些列」的細節的意思。Sheesh。 – Spacedman 2013-05-03 08:47:20

回答

1

由於您已經特別詢問了ab刪除行,這裏是我怎麼做,下面的替代方案。

#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()一切迅速轉換爲數值,有可能是一個更優雅的方式來做到這一點...

+0

你的兩個例子都能工作,我得到的行被刪除或者值被改爲' NA',但之後R是抱怨非數值,即使在以前工作的列 – 2013-05-03 09:30:32

+0

我想你需要將相關列轉換爲數字('as.numeric()'),但沒有你的數據那裏沒辦法知道確定 – alexwhan 2013-05-03 09:37:11

+0

我是否正確:'as.numeric(logs $ hotplate)'?之後,我仍然得到非數字錯誤。多少數據會有用?該文件有很多行。 – 2013-05-03 10:30:34

1

既然你寫的,你是開放的比爲R處理它們的其他方式。 ...

在常規終端窗口(未在R-控制檯):

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

選項-v反轉匹配,outputin g所有不匹配的行。

抓住所有在既無#N/AO/C行:

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

太棒了!這至少適用於大多數列。有些仍然沒有被識別爲數字:-( – 2013-05-03 10:32:20

+0

你爲'str(日誌)'得到了什麼輸出? – mike 2013-05-03 21:05:42

0

read.table有益刪除註釋字符後的任何東西。

註釋字符由comment.char參數定義。

參見help(read.table)

當然,我只能猜測你正在使用read.table,因爲你不給我們示例代碼或錯誤消息或什麼都不是。

+0

我使用'read.delim',因爲這些表是用製表符分隔的。日誌某處?它有大約185 000行和大小20 MiB。 關於錯誤按摩:http://stackoverflow.com/questions/16347731/how-to-change-the-locale-of-r- in-rstudio – 2013-05-03 09:07:41

+0

如果您想爲測試目的製作一個較短版本的CSV文件,您可以在命令行上使用'head -50 bigfile.csv> smallfile.csv'。當然,確保您有足夠的小文件來演示失敗的行爲! – Spacedman 2013-05-03 10:58:46

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"),] 

一個襯墊