R函数适用于单个列,但不适用于apply

时间:2014-12-13 18:50:44

标签: r matrix apply xts

我有以下问题。我创建了这个简单的函数来从向量(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没有变化。我不明白这是什么问题。

有人可以帮帮我吗?非常感谢

2 个答案:

答案 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)