2017-02-13 16 views
0

我想列出組中的唯一ID,其中可以由用戶選擇分組變量。以下作品:使用data.table中的條件時,下標越界

if(useGroupVar1){ 

    dt[,unique(id),.(group1a,group1b,group1c)] 

} else { 

    dt[,unique(id),group2] 

} 

我在我的代碼中用來過濾行的表達式實際上相當長,所以我想避免重複代碼。我想出了這個「解決方案」,這實際上並沒有正常工作:

dt[,unique(id),if(useGroupVar1){.(group1a,group1b,group1c)}else{group2}] 

如果條件導致單獨使用group2,它的工作原理(雖然列名爲if),而是試圖得到它使用.(group1a,group1b,group1c)

eval(expr,envir,enclos)中的錯誤:找不到函數「。」現在

,我讀.()是一個別名list(),所以採用後者讓我在bysubl [JJ + 1L]這個

錯誤:下標越界

有沒有辦法在不復制整個表達式的情況下實現條件by

+1

你有嘗試一個正常的字符向量(引用)? –

+0

我會做到這一點:'by = if(useGroupVar1)paste0('group1',c('a','b','c'))else'group2')' – MichaelChirico

+0

這樣做,並得到這個非常描述性的錯誤! '[.data.table'錯誤'(tabla,if(identical(codificacion [[1]] [i] $ codCIE,: 'by')似乎評估爲列名,但不是c()或如果可以,則使用by = list(...)否則,通過= eval(if(!porEESS){c(「cod_dpto」,「cod_prov」,「cod_dist」)} else {cod_2000})應該工作,這是爲了提高效率,所以data.table可以檢測到需要哪些列。' – zipzapboing

回答

4

只是個人喜好,但我不喜歡在data.table的一個by=語句中粘貼字符串(對我來說不太可讀)。相反,我會使用用戶選擇的變量(var)並創建一個分組變量列表。然後,您可以輕鬆地選擇變量,像這樣:

groupVars <- list(
    GroupVar1 = c("group1a","group1b","group1c"), 
    GroupVar2 = c("groupXYZ", "groupABC"), 
    GroupVarX = "group2" 
) 

# user selects that - for example - var = "GroupVar2" 

dt[, unique(id), by = groupVars[[var]]] 

作爲一個方面說明:

您可以輕鬆地擴展這種變量選擇了其中一個允許用戶選擇多套的情況下,分組變量。在這種情況下,你可以把它如下:

假設,即用戶選擇的變量是現在:

var <- c("GroupVar1", "GroupVarX") # two groups selected 

然後,by=聲明變成:

dt[, unique(id), by = unlist(groupVars[var], use.names=FALSE)] 
+0

我甚至會使用'switch' _a la_'groupVars = switch(var,GroupVar1 = ...)' – MichaelChirico

+0

最後一行可以是'unique(dt [,c(groupVars [[var]],「id」)] )',我想。 – Frank

+1

@Frank,真的,但這是一個更具體的情況,而我的答案應該是data.table通用的= statement –