根据R中列的滞后值替换单个值

时间:2016-04-27 17:22:35

标签: r time-series apply

我有一个包含许多列的ts数据集。对于每一列,我想用等于滞后的值替换相同的值加上一个非常小的项(任何类型的噪声),让我们说标准差的一小部分。 我写了这个函数并使用了简单的应用函数。

a <- c(1,2,2,3,4,5,6)
b <- c(4,5,6,7,8,8,9)
data <- data.frame(cbind(a,b))
repetitions <- function(x) {
x[x == lag(x) & !is.na(x) & !is.na(lag(x))] <- x+0.000001
x
}
datanew <- data.frame(apply(data, 2, repetitions ))

如果我使用一个号码就可以使用,例如1000,如果我把 x + 0.000001 它返回错误的数字。 我知道解决方案并不是很困难,但我只发现了NA问题,而且我对这个程序非常感兴趣。

非常感谢你的帮助。

EDIT。我希望mwe是正确的,我是这个的新手

2 个答案:

答案 0 :(得分:0)

这是一种data.table方式,它并不是非常优雅,但却很有效。

a <- c(1,2,2,3,4,5,6)
b <- c(4,5,6,7,8,8,9)
data <- data.table(cbind(a,b))

repetitions <- function(x,dat) {

  dat[eval(as.name(x)) == shift(eval(as.name(x)),type='lag') & !is.na(eval(as.name(x))) & !is.na(shift(eval(as.name(x)),type='lag'))
      ,eval(as.name(x)):=eval(as.name(x))+0.000001]

}

data_2<-copy(data)

for(i in names(data_2)){

  repetitions(i,data_2)
}

data_2
data_2

          a        b
1: 1.000000 4.000000
2: 2.000000 5.000000
3: 2.000001 6.000000
4: 3.000000 7.000000
5: 4.000000 8.000000
6: 5.000000 8.000001
7: 6.000000 9.000000

答案 1 :(得分:0)

解决

@cerpintax所说的问题是一个不同长度的问题:为了使其正确而对条件进行调整是足够的。

非常感谢@jason:你的解决方案有效但我发现了一个错误:当我在更大的数据集上使用你的代码时,我得到了一些NA而不是替换(不知道为什么)。

这是工作代码,非常简单!我只是讨厌自己花这么多时间在这一点上......

/* Vertically center tooltip content for left/right tooltips */
.tooltip-left:after, {
   margin-left: 0;
   margin-bottom: 0;
}