除了使用選項馬特Dowle的建議,更改列類的另一種方式如下:
dat[, (cols) := lapply(.SD, factor), .SDcols=cols]
通過使用:=
您可以通過引用更新數據表。支票,這是否工作:
> sapply(dat,class)
ID Quarter value
"factor" "factor" "numeric"
正如評論suggeted通過@MattDowle,你也可以使用的for(...) set(...)
組合如下:
for (col in cols) set(dat, j = col, value = factor(dat[[col]]))
這將給予同樣的結果。第三個選擇是:
for (col in cols) dat[, (col) := factor(dat[[col]])]
在一個較小的數據集,該for(...) set(...)
選項比lapply
選項快約三倍(但其實並不重要,因爲它是一個小的數據集)。在較大的數據集上(例如200萬行),這些方法中的每一種都需要大致相同的時間。對於在更大的數據集進行測試時,我用:
dat <- data.table(ID=c(rep("A", 1e6), rep("B",1e6)),
Quarter=c(1:1e6, 1:1e6),
value=rnorm(10))
有時候,你將不得不這樣做有點不同(例如,當數值存儲爲一個因素)。然後,你必須使用這樣的事情:
dat[, (cols) := lapply(.SD, function(x) as.integer(as.character(x))), .SDcols=cols]
警告:下面的解釋是不做事data.table
三通。數據表不會通過引用進行更新,因爲複製是在內存中創建並存儲的(如@Frank指出的那樣)會增加內存使用量。它更多的是爲了解釋with=FALSE
的工作。
當你想更改的列類,你會用一個數據框做同樣的方式,你必須添加with = FALSE
如下:
dat[, cols] <- lapply(dat[, cols, with = FALSE], factor)
的檢查,這是否工作:
> sapply(dat,class)
ID Quarter value
"factor" "factor" "numeric"
如果您未添加with = FALSE
,則數據表將評估爲dat[, cols]
作爲向量。檢查的輸出差異dat[, cols]
和dat[, cols, with=FALSE]
之間:
> dat[, cols]
[1] "ID" "Quarter"
> dat[, cols, with=FALSE]
ID Quarter
1: A 1
2: A 2
3: A 3
4: A 4
5: A 5
6: B 1
7: B 2
8: B 3
9: B 4
10: B 5
我相信方法馬特Dowle建議將是最好的。畢竟,他是* data.table *作者。 –
是的,但評論是從2013年開始的,自那以後有很多軟件包更新,所以我認爲值得把這條釣魚線扔出 – arvi1000
更多關於'for(...)set(...)'成語的詳細信息最近在這裏:http://stackoverflow.com/a/33000778/403310 –