我有以下问题。我创建了这个简单的函数来从向量(xts)中删除最后2个非NA值。它完美地运作。
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])
我得到了正确的结果(即用NA替换最后2个非NA值)。但如果我使用apply:
apply(d, 2, last2na)
然后没有任何反应。我返回原始矩阵d没有变化。我不明白这是什么问题。
有人可以帮帮我吗?非常感谢
答案 0 :(得分: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
在其任务中失败的原因。
?apply
下记录的转换:
如果X不是数组而是具有非空昏暗值的类的对象(例如数据框),则应用尝试通过as.matrix将其强制转换为数组(如果它是二维的)(例如,数据框)或通过as.array
基本上,它正在做apply(as.matrix(d), 2, last2na)
。
只要了解出了什么问题就行了。如果您正在寻找解决方案,我不是xts
个对象的专家,但我注意到lag(d, -2)
适用于整个&#34;矩阵&#34;所以你可以使用这个添加滞后然后删除它的技巧:
d <- d + lag(d, -2) - lag(d, -2)
NA
,则添加会将值转换为NA
NA
,添加然后减去值将无效。答案 1 :(得分:0)
看起来apply无法处理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)