2012-08-22 52 views
2

我目前在做一些試驗用的data.tableset功能R並具有以下代碼:我在做什麼錯(data.table,R)?

dt= data.table(ans=rep(c(14,16),100)) 
    dt[,voy:=0.0] 
    set(dt,which(dt[,ans]==14),"voy",log(dt[,ans])) 
    dt 

注意,我想計算的使用set功能爲ans=14這些情況下,對數,但我沒有得到正確的結果。這是我得到的結果是:

ans  voy 
    1: 14 2.639057 
    2: 16 0.000000 
    3: 14 2.772589 
    4: 16 0.000000 
    5: 14 2.639057 
    ---    
    196: 16 0.000000 
    197: 14 2.639057 
    198: 16 0.000000 
    199: 14 2.772589 
    200: 16 0.000000 

你可能注意到,對於一些行變量voy的價值是預期log(14)=2.639057但有ans=14它被分配2.772589=log(16)其他案件。所以,我認爲我在濫用set功能。我該如何解決這個問題? 我知道下一個代碼可以用來執行這一點:

dt[ans==14,voy:=log(ans)] 

但我想翻譯成set函數的語法此。

+2

爲什麼?你展示了一個可行的,很好的選擇。爲什麼用更復雜的東西代替它? – Andrie

+0

你是對的@安德烈,但我只是想確保我理解''''''函數的工作方式。謝謝! – Nestorghh

回答

3

您需要爲值參數的數據子集。在你的情況下,警告提供了200項將被分配給100個欄目'voy'(100未使用)可能給你一個想法。您正在逐一挑選dt$ans的前100個值,它們確實是14和16的交替值。

這樣,它的工作原理:

set(dt,which(dt[,ans]==14),"voy",log(dt[ans==14,ans])) 

,並提供:

 ans  voy 
    1: 14 2.639057 
    2: 16 0.000000 
    3: 14 2.639057 
    4: 16 0.000000 
    5: 14 2.639057 
---    
196: 16 0.000000 
197: 14 2.639057 
198: 16 0.000000 
199: 14 2.639057 
200: 16 0.000000 

但它的醜陋的代碼,如@Andrie已經說過。