2017-10-04 82 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))]