6

我很确定这很简单,但似乎卡住了……我有两个 xts 向量已合并在一起,其中包含数值和 NA。

我想获取每个索引周期的 rowSums,但保留 NA 值。

下面是一个可重现的例子

set.seed(120)
dd <- xts(rnorm(100),Sys.Date()-c(100:1))
dd1 <- ifelse(dd<(-0.5),dd*-1,NA)
dd2 <- ifelse((dd^2)>0.5,dd,NA)
mm <- merge(dd1,dd2)
mm$m <- rowSums(mm,na.rm=TRUE)
tail(mm,10)

                 dd1        dd2        m
2013-08-02        NA         NA 0.000000
2013-08-03        NA         NA 0.000000
2013-08-04        NA         NA 0.000000
2013-08-05 1.2542692 -1.2542692 0.000000
2013-08-06        NA  1.3325804 1.332580
2013-08-07        NA  0.7726740 0.772674
2013-08-08 0.8158402 -0.8158402 0.000000
2013-08-09        NA  1.2292919 1.229292
2013-08-10        NA         NA 0.000000
2013-08-11        NA  0.9334900 0.933490

在上面 2013 年 8 月 10 日的示例中,我希望它会说NA而不是02013 年 8 月 2 日至 4 日的情况。

关于在相关地方获得 NA 的优雅方式有什么建议吗?

4

4 回答 4

9

如果您有可变数量的列,您可以尝试这种方法:

mm <- merge(dd1,dd2)
mm$m <- rowSums(mm, na.rm=TRUE) * ifelse(rowSums(is.na(mm)) == ncol(mm), NA, 1)
# or, as @JoshuaUlrich commented:
#mm$m <- ifelse(apply(is.na(mm),1,all),NA,rowSums(mm,na.rm=TRUE))
tail(mm, 10)
#                  dd1        dd2        m
#2013-08-02        NA         NA       NA
#2013-08-03        NA         NA       NA
#2013-08-04        NA         NA       NA
#2013-08-05 1.2542692 -1.2542692 0.000000
#2013-08-06        NA  1.3325804 1.332580
#2013-08-07        NA  0.7726740 0.772674
#2013-08-08 0.8158402 -0.8158402 0.000000
#2013-08-09        NA  1.2292919 1.229292
#2013-08-10        NA         NA       NA
#2013-08-11        NA  0.9334900 0.933490
于 2013-08-12T14:51:15.633 回答
3

使用逻辑索引[is.na(·)来本地化两者都存在的条目,NA然后将它们替换为NA.

尝试这个:

> mm[is.na(mm$dd1) & is.na(mm$dd2), "m"] <- NA
> mm
                 dd1        dd2        m
2013-08-02        NA         NA       NA
2013-08-03        NA         NA       NA
2013-08-04        NA         NA       NA
2013-08-05 1.2542692 -1.2542692 0.000000
2013-08-06        NA  1.3325804 1.332580
2013-08-07        NA  0.7726740 0.772674
2013-08-08 0.8158402 -0.8158402 0.000000
2013-08-09        NA  1.2292919 1.229292
2013-08-10        NA         NA       NA
2013-08-11        NA  0.9334900 0.933490
于 2013-08-12T14:47:32.987 回答
1
mm$m <- "is.na<-"(rowSums(mm, na.rm = TRUE), !rowSums(!is.na(mm)))

> tail(mm)
#                  dd1        dd2        m
# 2013-08-06        NA  1.3325804 1.332580
# 2013-08-07        NA  0.7726740 0.772674
# 2013-08-08 0.8158402 -0.8158402 0.000000
# 2013-08-09        NA  1.2292919 1.229292
# 2013-08-10        NA         NA       NA
# 2013-08-11        NA  0.9334900 0.933490
于 2013-08-12T15:09:29.000 回答
0

我的解决方案是

library(magrittr)
mm <- mm %>% 
      transform(ccardNA = rowSums(!is.na(.))/rowSums(!is.na(.)), m = rowSums(., na.rm = TRUE)) %>%
      transform(m = ifelse(is.nan(ccardNA), NA, m), ccardNA = NULL) %>%
      as.xts()
于 2019-09-10T08:09:47.230 回答