2014-06-10 25 views
1

我在data.tables和其他一些data.tables中有多個海量數據集,其中包含我想要對其執行的基本表達式使用類似:=的東西。如何使用變量表達式添加/更改多個data.table列

的樣本數據:

library(data.table) 
tt = data.table(date=c(2011, 2012, 2013, 2014), count=c(2774343,4655434,648113695, 357733805)) 

    date  count 
1: 2011 2774343 
2: 2012 4655434 
3: 2013 648113695 
4: 2014 357733805 

樣品轉換表。某些列可能是新的,其他列可能正在修改預先存在的列。我需要他們充分利用'with'功能,這意味着他們需要參考現有的列,即使他們正在創建新的列。

xform=data.table(var=c("date2", "count2"), val=c("date - 2000", "count/1000")) 

     var   val 
1: date2 date - 2000 
2: count2 count/1000 

我只是無法想象得到這個工作的神奇公式。我已經嘗試過使用:=[.data.table裏的lapply,parse,eval等等各種組合。

我最後的希望是這樣的:

> xform[,expr := lapply(val, FUN=function(x) parse(text=x))] 
> tt[,(xform$var) := eval(xform$expr)] 
Error in eval(expr, envir, enclos) : attempt to apply non-function 

訣竅是我輸入的數據是海量的,包含多達100列,而一些轉換的可能是微不足道的,其他人可能是複雜的。

在這種情況下,輸出應該是這樣的:

date  count date2  count2 
1: 2011 2774343 11 2774.343 
2: 2012 4655434 12 4655.434 
3: 2013 648113695 13 648113.695 
4: 2014 357733805 14 357733.805 

在此先感謝您的幫助!

+0

我只設法使用一個表達式來工作,例如'xform = data.table(var =「date2」,val =「date - 2000」); tt [,xform $ var:= eval(parse(text = xform $ val))]' –

+0

我也試過!由於解析不能列表,我正在分別嘗試lapply(val,parse)和eval階段;我想我可能會碰到'[.data.table'和':='的一些內部邏輯,但我無法想象出什麼。 –

回答

1

我認爲你必須按行(的xform)做此行:

for(i in 1:nrow(xform)) 
    tt[, xform$var[i] := eval(parse(text = xform$val[i]))] 

tt 
# date  count date2  count2 
#1: 2011 2774343 11 2774.343 
#2: 2012 4655434 12 4655.434 
#3: 2013 648113695 13 648113.695 
#4: 2014 357733805 14 357733.805 

如果存儲轉換的功能,而不是文本但是,你可以做,而不是執行以下操作:

xform = data.table(var = c("date2", "count2"), 
        val = c(quote(date - 2000), quote(count/1000))) 

tt[, xform$var := lapply(xform$val, eval, .SD)] 
+0

是的,那我也想要根據我在評論中的發現而提出的建議,但是認爲你和@Arun會笑我:) –

+0

@DavidArenburg夠公平 - 另外一個選項加上:) – eddi

+0

(+1)真棒。我認爲你應該刪除循環之一,然後離開第二個解決方案。我喜歡你如何將'.SD'放到末尾,並在'xform $ val'上操作,我永遠不會想出這個 –

相關問題