rowSums 但保留 NA 值 [英] rowSums but keeping NA values

查看:21
本文介绍了rowSums 但保留 NA 值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很确定这很简单,但似乎卡住了……我有两个合并在一起的 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 <- 合并(dd1,dd2)mm$m <- rowSums(mm,na.rm=TRUE)尾(mm,10)dd1 dd2 米2013-08-02 不适用 不适用 0.0000002013-08-03 不适用 不适用 0.0000002013-08-04 不适用 不适用 0.0000002013-08-05 1.2542692 -1.2542692 0.0000002013-08-06 不适用 1.3325804 1.3325802013-08-07 不适用 0.7726740 0.7726742013-08-08 0.8158402 -0.8158402 0.0000002013-08-09 不适用 1.2292919 1.2292922013-08-10 不适用 不适用 0.0000002013-08-11 不适用 0.9334900 0.933490

在 2013 年 8 月 10 日的上述示例中,我希望它会说 NA 而不是 0,2013 年 8 月 2 日至 4 日也是如此.>

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

解决方案

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

mm <- 合并(dd1,dd2)mm$m <- rowSums(mm, na.rm=TRUE) * ifelse(rowSums(is.na(mm)) == ncol(mm), NA, 1)# 或者,正如@JoshuaUlrich 评论的那样:#mm$m <- ifelse(apply(is.na(mm),1,all),NA,rowSums(mm,na.rm=TRUE))尾部(毫米,10)# dd1 dd2 米#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 不适用 1.3325804 1.332580#2013-08-07 不适用 0.7726740 0.772674#2013-08-08 0.8158402 -0.8158402 0.000000#2013-08-09 不适用 1.2292919 1.229292#2013-08-10 NA NA NA#2013-08-11 不适用 0.9334900 0.933490

I am pretty sure this is quite simple, but seem to have got stuck...I have two xts vectors that have been merged together, which contain numeric values and NAs.

I would like to get the rowSums for each index period, but keeping the NA values.

Below is a reproducible example

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

In the above example on the 10th Aug 2013 I was hoping it would say NA instead of 0, the same goes for the 2nd-4th Aug 2013.

Any suggestions for an elegant way of getting NAs in the relevant places?

解决方案

If you have a variable number of columns you could try this approach:

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

这篇关于rowSums 但保留 NA 值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆