Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 行和但保持NA值_R_Xts - Fatal编程技术网

R 行和但保持NA值

R 行和但保持NA值,r,xts,R,Xts,我很确定这很简单,但似乎被卡住了……我有两个xts向量,它们被合并在一起,包含数值和NAs 我希望得到每个索引周期的行和,但保留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 <

我很确定这很简单,但似乎被卡住了……我有两个xts向量,它们被合并在一起,包含数值和NAs

我希望得到每个索引周期的行和,但保留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
set.seed(120)

dd使用
[
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
>mm[is.na(mm$dd1)和is.na(mm$dd2),“m”]mm
dd1 dd2 m
2013-08-02不适用
2013-08-03不适用
2013-08-04不适用
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年8月10日不适用
2013-08-11 NA 0.9334900 0.933490

如果列数可变,可以尝试以下方法:

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
mm
mm$m尾部(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年8月10日不适用
#2013-08-11 NA 0.9334900 0.933490
我的解决方案是

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()
库(magrittr)
毫米%
转换(ccardNA=rowSums(!is.na(.))/rowSums(!is.na(.)),m=rowSums(.,na.rm=TRUE))%>%
转换(m=ifelse(is.nan(ccardNA),NA,m),ccardNA=NULL)%>%
as.xts()

再次检查
all(is.na(rowValues))所在的行
TRUE
,并将这些位置的值设置为
NA
。一个稍有不同的命令:
mm$m@JoshuaUlrich我最喜欢你的解决方案…漂亮、整洁/优雅…因此,如果你想得到完整的答案,我会在…@h.l.m旁边打勾,这是相同的概念;我会将它编辑到这个答案中。而这是有效的s、 几乎所有看你的代码的人都会感到困惑。
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()