我發現有關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
但是,也許那裏有這種解決方法也失敗了這樣的情況?
在這種情況下是否有預期會失敗的列名稱列表?
用戶定義函數或加載庫是否會導致相同的錯誤?
是否有一個更安全的方式來做到這一點,我應該使用?
它看起來像在1.9.4熟悉的錯誤。升級或在其周圍放置括號,如'dt [(class == 3),mean(value)]''。順便說一句,如果你可以讓你的例子只用幾行工作,爲什麼不呢?如果你必須去100,請記住使用'set.seed'。 – Frank
對不起,如果這個例子太大了。我在回答我打開的另一個問題(看起來您剛剛遷移到Stats?)時遇到了這個問題。我不認爲100是一個很大的數字,因爲我只是將它從1000000中刪除。不知道爲什麼你建議set.seed ---行數與選擇種子有什麼關係?或者是你的觀點(正確),在沒有set.seed()的情況下,確切的數字是不可重現的? –
「正確」?對了謝謝。在這種情況下'set.seed'的意義在於,人們可以確認達到了預期的結果。 「你爲什麼不呢?」我的意思是提醒你最好在這裏寫出最簡單的例子......並且可以想到爲什麼在這種情況下的一個原因:如果你的例子足夠小,它可以作爲問題的一部分打印,使讀者更快掌握你在做什麼並試圖去做。嘿,那正是我所做的。繼續前進並遵循你自己的判斷。 – Frank