我有一个包含许多列的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是正确的,我是这个的新手
答案 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;
}