2015-11-07 60 views
4

我正在嘗試min/max聚合在動態選擇列在data.table。它適用於numeric列,但我無法在Date列上工作,除非我創建了一個臨時data.tableR: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))] 
+0

簡短回答:使用'.SD [[1]]'因爲'.SD'是一個向量列表,您想要使用它的第一個矢量。很長的回答:你似乎發現了一些奇怪的漏洞,其中所有數字列的data.frame都可以有最大值和最小值;而且我不會建立在那個奇怪的例外上。 – Frank

回答

2

在您第一次嘗試:

dt[, .(minValue = min(colName), maxValue = max(colName)), with=F] 
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), : 
# could not find function "." 

您應該簡單地閱讀Introduction to data.table小插曲瞭解什麼with=手段。如果你知道從基地R.

with()功能在第二個它更容易:

dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName] 
# Error in FUN(X[[i]], ...) : 
# only defined on a data frame with all numeric variables 

這似乎是與min()max()在data.frame問題/ data.table與列具有屬性。這是一個MRE。

df = data.frame(x=as.Date("2015-01-01")) 
min(df) 
# Error in FUN(X[[i]], ...) : 
# only defined on a data frame with all numeric variables 

要回答你的問題,你可以使用get()

dt[, .(min = min(get(colName)), max = max(get(colName)))] 

或者作爲@Frank建議,[[運營商子集列:

dt[, .(min = min(.SD[[colName]]), max = max(.SD[[colName]]))] 

有沒有一個更好的辦法將.SD應用於多個函數(因爲基本R似乎沒有一個AFAICT,並且data.table儘可能地嘗試使用基本R函數)。有一個FR #1063來解決這個問題。例如:如果/執行該操作,則可以執行下列操作,例如:

# NOTE: not yet implemented, FR #1063 
dt[, colwise(.SD, min, max), .SDcols = colName] 
+0

考慮到這個問題,對於OP來說,一個笨拙的解決方法是'dcast(dt,。〜。,value.var =「Date」,fun = list(min,max))'或'dcast(dt, 〜。,價值。var = names(dt),fun = list(min,max))'同時做兩個變量。 – Frank

相關問題