根据R中列中的滞后值替换单个值
Replace single values according to lagged value in column in R
我有一个包含很多列的 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 它 returns 错误的数字。
我知道解决方案不是很困难,但我只发现了 NA 问题,而且我在程序的这一点上很困。
非常感谢您的帮助。
编辑。我希望mwe是正确的,我是这个的新手
这里有一个 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
已解决
@cerpintax 所说的问题是一个不同长度的问题:对替换进行条件调整以使其正确。
非常感谢@jason:你的解决方案有效,但我发现了一个错误:当我在更大的数据集上使用你的代码时,我得到了一些 NA 而不是替换(不知道为什么)。
这是工作代码,非常简单!我只是讨厌自己花这么多时间在这一点上..
repetitions <- function(x) {
x[x == lag(x) & !is.na(x) & !is.na(lag(x))] <- x[x == lag(x) & !is.na(x) & !is.na(lag(x))] + (0.0001*sd(x, na.rm = T))
x
}
ITA_HD6 <- data.frame(apply(ITA_HD5, 2, repetitions))
我有一个包含很多列的 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 它 returns 错误的数字。 我知道解决方案不是很困难,但我只发现了 NA 问题,而且我在程序的这一点上很困。
非常感谢您的帮助。
编辑。我希望mwe是正确的,我是这个的新手
这里有一个 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
已解决
@cerpintax 所说的问题是一个不同长度的问题:对替换进行条件调整以使其正确。
非常感谢@jason:你的解决方案有效,但我发现了一个错误:当我在更大的数据集上使用你的代码时,我得到了一些 NA 而不是替换(不知道为什么)。
这是工作代码,非常简单!我只是讨厌自己花这么多时间在这一点上..
repetitions <- function(x) {
x[x == lag(x) & !is.na(x) & !is.na(lag(x))] <- x[x == lag(x) & !is.na(x) & !is.na(lag(x))] + (0.0001*sd(x, na.rm = T))
x
}
ITA_HD6 <- data.frame(apply(ITA_HD5, 2, repetitions))