2017-07-17 51 views
2

我已經data.table[R腳本:雖然data.table使用移功能 - errror:(列表)對象不能被強制鍵入「雙重」

set.seed(1) 
dat <- data.table(Shift = c(c(0,0,0,1,2,1,1)), 
       Value = rnorm(7),I.Value = rnorm(7)) 
dat 
Shift  Value I.Value 
0  -0.6264538 0.7383247 
0  0.1836433 0.5757814 
0  -0.8356286 -0.3053884 
1  1.5952808 1.5117812 
2  0.3295078 0.3898432 
1  -0.8204684 -0.6212406 
1  0.4874291 -2.2146999 

我希望新列是移(值,移位,填充= 0)。因此,結果應該是─

Shift  Value I.Value new.value new.I.value 
    0  -0.6264538 0.7383247 -0.6264538 0.7383247 
    0  0.1836433 0.5757814 0.1836433 0.5757814 
    0  -0.8356286 -0.3053884 -0.8356286 -0.3053884 
    1  1.5952808 1.5117812 0   0 
    2  0.3295078 0.3898432 1.5952808 1.5117812 
    1  -0.8204684 -0.6212406 0   0 
    1  0.4874291 -2.2146999 0.3295078 0.3898432 

我有什麼至今:

dat[,`:=` (new.value= shift(Value,Shift,fill = 0), 
     new.I.value=shift(I.Value,Shift,fill = 0))] 

但由於參數shift長度爲1不移位函數返回一個列表,而是整個矢量。因此,我面對的錯誤:

Error in `[.data.table`(dat[Shift == 0, `:=`(new = Value)], !Shift == : 
(list) object cannot be coerced to type 'double' 

我試過傳遞Shift [.I],但也沒有工作。

我該如何傳遞列Shift的行值,以便向量返回並獲得正確的結果? 由於我的工作數據集非常龐大,我更喜歡使用data.table。


編輯:

由上述函數生成

-The輸出爲 -

Shift  Value I.Value grp  new2  new3 
1:  0 -1.22461261 1.7672873 1 -1.2246126 1.7672873 
2:  0 -0.47340064 0.7167075 1 -0.4734006 0.7167075 
3:  0 -0.62036668 0.9101742 1 -0.6203667 0.9101742 
4:  1 0.04211587 0.3841854 2 0.0000000 0.0000000 
5:  2 -0.91092165 1.6821761 3 0.0000000 0.0000000 
6:  1 0.15802877 -0.6357365 4 0.0000000 0.0000000 
7:  1 -0.65458464 -0.4616447 4 0.1580288 -0.6357365 

第四行應被移動到第五作爲dat$Shift[4]==1和第五行應被移動到7日爲dat$Shift[5]==2。如果簡單地設置爲寫

dat[,new:=shift(Value,2,fill=0),new.I:=shift(I.Value,2,fill=0)] 

將所有行由2向下移動爲n = 2,只是代替硬編碼的值的,n具有存在於下過程當前行的列「換檔」的值。

+0

什麼是'Shift'在'shift'打電話? – akrun

+0

你是否把'Shift'換成'n'? – akrun

+0

我不確定你想要的輸出是否非常清晰,你能告訴我你是如何到達最後四行的結果嗎? –

回答

1

這項工作?

請注意,我優先考慮第5行中的值,因爲第6行中的值將被移至相同的位置。

shift2 <- function(val,shift,fill){ 
    new_val <- rep(fill,length(val)) 
    indices <- (1:length(val))+shift 
    indices <- indices[indices <= nrow(dat)] 
    new_val[rev(indices)]= val[length(indices):1] 
    new_val 
} 

dat[,`:=` (new.value= shift2(Value,Shift,fill = 0), 
      new.I.value=shift2(I.Value,Shift,fill = 0))] 

# > dat 
# Shift  Value I.Value new.value new.I.value 
# 1:  0 -0.6264538 0.7383247 -0.6264538 0.7383247 
# 2:  0 0.1836433 0.5757814 0.1836433 0.5757814 
# 3:  0 -0.8356286 -0.3053884 -0.8356286 -0.3053884 
# 4:  1 1.5952808 1.5117812 0.0000000 0.0000000 
# 5:  2 0.3295078 0.3898432 1.5952808 1.5117812 
# 6:  1 -0.8204684 -0.6212406 0.0000000 0.0000000 
# 7:  1 0.4874291 -2.2146999 0.3295078 0.3898432 

如果你想在5行優先排6:

shift3 <- function(val,shift,fill){ 
    new_val <- rep(fill,length(val)) 
    indices <- (1:length(val))+shift 
    indices <- indices[indices <= nrow(dat)] 
    new_val[indices]= val[1:length(indices)] 
    new_val 
} 

dat[,`:=` (new.value= shift3(Value,Shift,fill = 0), 
      new.I.value=shift3(I.Value,Shift,fill = 0))] 
# 
# Shift  Value I.Value new.value new.I.value 
# 1:  0 -0.6264538 0.7383247 -0.6264538 0.7383247 
# 2:  0 0.1836433 0.5757814 0.1836433 0.5757814 
# 3:  0 -0.8356286 -0.3053884 -0.8356286 -0.3053884 
# 4:  1 1.5952808 1.5117812 0.0000000 0.0000000 
# 5:  2 0.3295078 0.3898432 1.5952808 1.5117812 
# 6:  1 -0.8204684 -0.6212406 0.0000000 0.0000000 
# 7:  1 0.4874291 -2.2146999 -0.8204684 -0.6212406 
+0

這個工程!謝謝!如果要求更改爲最後一行,如何更改函數shift2()。即我保持第6行而不是第5行。 'Shift Value I.Value new.value new.I.value 1 0.4874291 -2.2146999 -0.8204684 -0.6212406' – Riya

+0

我爲這種可能性編輯了我的答案,它全部發生在函數體的第四行,值被恢復給定的順序。 –

+0

這太棒了!我是data.table的新手,所以這對我來說是一個很好的學習經驗。謝謝! – Riya