2014-12-13 126 views
3

我遇到以下問題。我創建了這個簡單的函數來刪除矢量(xts)中的最後2個非NA值。它完美的作品。R函數適用於單個列,但不適用於

library(xts) 
last2na <- function(x) { x[which(is.na(lag(x,-2)))] <- NA; return(x) } 

但是,當我嘗試應用於矩陣(xts)列時,它對矩陣本身沒有任何影響。但是,如果我將這個函數單獨應用到每一列,那麼它確實有效。

例如,採取以下矩陣:

d <- xts(matrix(1:14, ncol=2), Sys.Date()+1:7) 
d[5:7,1] <- NA 
d[7,2] <- NA 

如果我申請的功能,每一列,例如第二:

last2na(d[,2]) 

我得到正確的結果(如更換最後2 NA爲非NA值)。但如果我使用apply:

apply(d, 2, last2na) 

然後沒有任何反應。我返回原始矩陣d,沒有任何變化。我不明白問題是什麼。

有人可以幫我這個嗎?非常感謝

回答

2

看看發生了什麼的一種方法是將print(str(x))添加到您的last2na函數中。或平原str替換爲:

str(d[,2]) 
# An ‘xts’ object on 2014-12-14/2014-12-20 containing: 
# Data: int [1:7, 1] 8 9 10 11 12 13 NA 
# Indexed by objects of class: [Date] TZ: UTC 
# xts Attributes: 
# NULL 

對戰:

apply(d, 2, str) 
# Named int [1:7] 1 2 3 4 NA NA NA 
# - attr(*, "names")= chr [1:7] "2014-12-14" "2014-12-15" "2014-12-16" "2014-12-17" ... 
# Named int [1:7] 8 9 10 11 12 13 NA 
# - attr(*, "names")= chr [1:7] "2014-12-14" "2014-12-15" "2014-12-16" "2014-12-17" ... 
# NULL 

你可以看到,apply不循環的xts列,但在普通整數向量,這是什麼讓last2na未能在其任務。

變換SI ?apply下記載:

如果X不是數組,但一個類的一個對象,具有一個非空調光值(如數據幀),應用嘗試它強制到通過as.matrix數組,如果它是二維的(例如,數據幀)或通過as.array

因此,本質上,它正在做apply(as.matrix(d), 2, last2na)

就是這樣理解錯誤。如果你正在尋找一個解決方案,我不xts對象的專家,但我注意到,lag(d, -2)作用於整個「黑客帝國」這樣你就可以使用添加的這一招的滯後,然後將其取出:

d <- d + lag(d, -2) - lag(d, -2) 
  • 其中滯後是NA,加法會將數值轉換爲NA
  • 其中滯後不是NA,加上然後減去一個值將不起作用。
+0

謝謝。這工作完美。你說得對,問題在於通過刪除xts結構來應用xts對象的工作(因此,延遲不起作用)。再次感謝 – john 2014-12-17 11:02:45

0

貌似應用無法處理XTS對象,你的函數不能處理矩陣:

d <- as.matrix(d) 
d 
last2na(d[,2]) 

下面是一個(不雅,我承認)解決方案:

last2na_matrix <- function(x) {x[is.na(x[-1])] <- NA; x[is.na(x[-1])] <- NA; return(x) } 

apply(d, 2, last2na_matrix) 
相關問題