2015-09-06 73 views
1

我發現有關data.table中特定列名稱的尖銳邊緣。我怎樣才能避免在他們身上割傷自己?假設我有一個data.table有兩列,'type'和'value'。R data.table列名稱的保留字?

numRows = 100 
numTypes = 10 
dt = data.table(type=sample(numTypes, numRows, replace=T), 
       value=rnorm(numRows)) 

如果我想看到快速計算出平均值與類型== 3的所有行,這個偉大的工程:

dt[type==3, mean(value)] 
# [1] 0.08086124 

但如果「人誰不是我」走過來決定那'type'對這個專欄來說是一個不好的名字,而且它確實應該是一個'class'?

setnames(dt, "type", "class") 

現在,當我嘗試等價操作,我得到可怕的錯誤消息:

dt[class==3, mean(value)] 
# Error in setattr(attr(x, "index"), paste(cols, collapse = "__"), o) : 
# attempt to set invalid 'class' attribute 

我這個預期的行爲(1.9.4在OSX)?我認爲這是因爲'class'是R中的一個函數名,而data.table內部的東西正在解釋它。包裹我子句中括號似乎解決了問題:

dt[(class==3), mean(value)] 
# [1] 0.08086124 

但是,也許那裏有這種解決方法也失敗了這樣的情況?

在這種情況下是否有預期會失敗的列名稱列表?

用戶定義函數或加載庫是否會導致相同的錯誤?

是否有一個更安全的方式來做到這一點,我應該使用?

+0

它看起來像在1.9.4熟悉的錯誤。升級或在其周圍放置括號,如'dt [(class == 3),mean(value)]''。順便說一句,如果你可以讓你的例子只用幾行工作,爲什麼不呢?如果你必須去100,請記住使用'set.seed'。 – Frank

+0

對不起,如果這個例子太大了。我在回答我打開的另一個問題(看起來您剛剛遷移到Stats?)時遇到了這個問題。我不認爲100是一個很大的數字,因爲我只是將它從1000000中刪除。不知道爲什麼你建議set.seed ---行數與選擇種子有什麼關係?或者是你的觀點(正確),在沒有set.seed()的情況下,確切的數字是不可重現的? –

+1

「正確」?對了謝謝。在這種情況下'set.seed'的意義在於,人們可以確認達到了預期的結果。 「你爲什麼不呢?」我的意思是提醒你最好在這裏寫出最簡單的例子......並且可以想到爲什麼在這種情況下的一個原因:如果你的例子足夠小,它可以作爲問題的一部分打印,使讀者更快掌握你在做什麼並試圖去做。嘿,那正是我所做的。繼續前進並遵循你自己的判斷。 – Frank

回答

2

這似乎已經修復了。更新你的data.table包。

library(data.table) 
set.seed(1) 
numRows = 100 
numTypes = 10 
dt = data.table(type=sample(numTypes, numRows, replace=T), 
       value=rnorm(numRows)) 
setnames(dt,"type","class") 
dt[class==3, mean(value)] 
# [1] -0.2300146 
+0

已確認固定在1.9.5,謝謝! –