2015-04-20 45 views
2

這段代碼工作正常:[R data.table lapply歸因列表類型的列

dt <- data.table(c(as.integer(98033),as.integer(980341234),as.integer(98033)),c(1,2,3)) 
dt[,.(count=.N),by=V1] 

,我的問題是,在這個代碼塊:

dt <- dt[,zips:=lapply(V1,fixzip)] 
dt[,.(count=.N),by=zips] 

會拋出

[.data.table(dt,,。(count = .N),by = zips)中的錯誤: 'by'或'keyby'列表中的項目是長度(1,1,1)。每個元素的長度必須與x中的行或i(3)返回的行數相同。

我認爲它與lapply賦值操作,隨着環境的瀏覽器顯示

V1:整數98033個980341234 98033

拉鍊:3

名單.. $ :int 98033

.. $:int 98034

.. $:int 98033

如何將lapply分配的列表更改爲普通列?或者如果有人能指出我更好的'R'方式來做到這一點,將不勝感激。

如果相關,該fixzip函數看起來像:

fixzip <- function(zip){ 
    if(is.finite(zip) == 0){ 
    return(0) 
    } 
    if(zip < 10000){ 
    return(0) 
    } 
    if(zip > 100000){ 
    return(as.integer(floor(zip/10000))) 
    } 
    return(zip) 
} 
+1

只需使用'sapply'而不是'lapply'。 –

+0

完美,謝謝。 – Alex

+0

如果你只在一列上使用它''V1',寫'zip:= fixit(V1)'。哦,我知道,它沒有矢量化。 – Frank

回答

1

使用sapply()而不是lapply()。 Sapply返回向量,而lapply返回列表。感謝@David Arenburg。