我正在嘗試min
/max
聚合在動態選擇列在data.table
。它適用於numeric
列,但我無法在Date
列上工作,除非我創建了一個臨時data.table
。R:data.table .dynamic aggregations on column日期列
它工作時,我使用的名稱:
colName = 'Index'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# minValue maxValue
# 1: 1 31
:
colName = 'Date'
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
我可以對數字列使用.SDcols
:
dt <- data.table(Index=1:31, Date = seq(as.Date('2015-01-01'), as.Date('2015-01-31'), by='days'))
dt[, .(minValue = min(Date), maxValue = max(Date))]
# minValue maxValue
# 1: 2015-01-01 2015-01-31
當我使用with=FALSE
它不工作
但是當我對日期列做同樣的事情時出現錯誤:
colName = 'Date'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
如果我使用lapply(.SD, min)
或sapply()
那麼日期更改爲數字。
下面的工作,似乎並不浪費記憶,而且速度很快。有更好的嗎?
a <- dt[, colName, with=F]
setnames(a, 'a')
a[, .(minValue = min(a), maxValue = max(a))]
簡短回答:使用'.SD [[1]]'因爲'.SD'是一個向量列表,您想要使用它的第一個矢量。很長的回答:你似乎發現了一些奇怪的漏洞,其中所有數字列的data.frame都可以有最大值和最小值;而且我不會建立在那個奇怪的例外上。 – Frank