将列随机数更改为串行

时间:2017-10-04 17:17:05

标签: r dataframe

在数据集中,有一个特定列作为随机值以规则间隔重复。我想用增加的值替换它们,如下所述。

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?感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

我们按照&#39; Column_B&#39;的累积总和进行分组其中元素为0(或下一个元素减少的位置)并获取roww序列以将其分配给&#39; Column_B&#39;

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

或者找到&#39; Column_B&#39;中的相邻元素之间的差异,根据该值获得累积总和以创建group_by变量

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