2017-10-04 137 views
0

在數據集中,有一個特定列作爲隨機值,以定期間隔重複。我想用下面解釋的值來代替它們。將列隨機數更改爲串行

Column_B具有隨機數據

Column_A Column_B 
    1.5  0 
    0.2  1 
    0.3  5 
    4.5  6 
    12.5  7 
    1.6  0 
    7.8  1 
    1.8  5 
    6.9  6 
    11.0  7 

改造後Column_B應該有

Column_A Column_B 
    1.5  0 
    0.2  1 
    0.3  2 
    4.5  3 
    12.5  4 
    1.6  0 
    7.8  1 
    1.8  2 
    6.9  3 
    11.0  4 

有一個更快的方法來做到這一點,而不是創建一個新列,然後用替換它Column_B?謝謝。

+0

你提前模式是如何頻繁地重複知道嗎? – dww

+0

@dww - 是的。對於數據集,我每隔64(作爲一個例子,我在5之後顯示)。我沒有看到它至少改變了我的工作方式。 –

回答

2

您可以使用回收利用重複序列填充色譜柱。例如,如果你想要的序列爲64長,然後重複,然後才能使用

DF$column_B <- 0:(64 - 1L) 

更一般地,對於喜歡你的例子,其中的重複序列中的每個元素都是不同的模式,你可以找到多久序列,使用which,然後做同樣的事情

seq.length = which(dt$B == dt$B[1L])[2L] - 1L 
dt$B = 0:(seq.length - 1L) 
1

我們通過「Column_B」,其中的元素爲0(或有在未來元素減少),並得到roww的序列分配的累積和組它到'Column_B'

library(data.table) 
setDT(df1)[, Column_B := as.integer(seq_len(.N)-1), cumsum(Column_B==0)] 
df1 
# Column_A Column_B 
# 1:  1.5  0 
# 2:  0.2  1 
# 3:  0.3  2 
# 4:  4.5  3 
# 5:  12.5  4 
# 6:  1.6  0 
# 7:  7.8  1 
# 8:  1.8  2 
# 9:  6.9  3 
#10:  11.0  4 

或者找到「Column_B」相鄰要素間的差異,得到基於這樣的累積和創造group_by變量

setDT(df1)[, Column_B := as.integer(seq_len(.N)-1), cumsum(c(TRUE, diff(Column_B)< 0))]