【问题标题】:R function works on individual column but not with applyR函数适用于单个列,但不适用于应用
【发布时间】:2014-12-13 18:50:43
【问题描述】:

我有以下问题。我创建了这个简单的函数来从向量 (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])

我得到了正确的结果(即将最后 2 个非 NA 值替换为 NA)。但如果我使用应用:

apply(d, 2, last2na)

然后什么都没有发生。我返回原始矩阵 d 没有任何变化。我不明白问题是什么。

有人可以帮我解决这个问题吗?非常感谢

【问题讨论】:

    标签: r matrix apply xts


    【解决方案1】:

    查看发生了什么的一种方法是将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 下记录的转换 si:

    如果 X 不是数组,而是具有非 null 暗值的类的对象(例如数据框),则应用尝试通过 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,则添加然后减去一个值将无效。

    【讨论】:

    • 谢谢。这完美地工作。你是对的,问题是 apply 通过删除 xts 结构对 xts 对象起作用(因此 lag 对它不起作用)。再次感谢
    【解决方案2】:

    看起来 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)
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2021-01-23
      • 2020-05-10
      • 2013-05-24
      • 2015-09-09
      • 2017-11-22
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多