2016-04-27 58 views
0

在列滯後值I具有很多列的TS數據集替換單個值。對於每一列,我想用相同的值加上一個非常小的項(任何類型的噪音)來代替等於它們滯後的值,假設是標準偏差的一小部分。 我寫了這個函數,並使用了簡單的應用函數。根據中的R

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的問題,我在這一點上的程序相當stucked。

非常感謝您的幫助。

編輯。我希望兆瓦是正確的,我的這個

+0

請出示重複的例子 – akrun

+1

呀,可重複的例子會有所幫助。它看起來像你的代碼中的'x'是一個向量,'x'和'x [x == lag(x)&!is.na(x)&!is.na(lag(x))]'會不是相同的長度,所以這會造成錯誤。 – cerpintaxt

+0

@cerpintaxt我想你明白了。我的目標是簡單地用x(值)+ 0.00001 * sd(x)代替,其中x是apply函數中使用的向量 – Mino

回答

0

解決

爲@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)) 
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 
+0

非常感謝!你能否向我解釋一些我從未見過的功能,比如:=?我還有兩個問題:1)如果我想添加一個標準偏差的一部分而不是0.00001,該怎麼辦? 2)在一個更大的數據集它不添加而是將其減去 – Mino

+0

我獨自一人拿到了第一點,有什麼關於+減去的事實 - 增加了? – Mino

+0

@Giacomo你的意思是減去什麼?這不是我在這裏展示的...另外,在'data.table'中,你可以在括號內的形式中做'x:=。01-sd(x)',它將在例子中計算 – Jason