【问题标题】:cumsum along row of data.frame with NA in RR中带有NA的data.frame行的cumsum
【发布时间】:2014-05-09 07:59:33
【问题描述】:

假设的情况是data.frame中存在NA

> a <- c(1:5, NA, 7:10)
> b <- 1:10
> c <- 1:10
> 
> data <- data.frame(a,b,c)
> data
    a  b  c
1   1  1  1
2   2  2  2
3   3  3  3
4   4  4  4
5   5  5  5
6  NA  6  6
7   7  7  7
8   8  8  8
9   9  9  9
10 10 10 10
> data <- data.frame(a,b,c)
> data.frame(t(apply(data,1,cumsum)))
    a  b  c
1   1  2  3
2   2  4  6
3   3  6  9
4   4  8 12
5   5 10 15
6  NA NA NA
7   7 14 21
8   8 16 24
9   9 18 27
10 10 20 30

我想要的结果是

    a  b  c
1   1  2  3
2   2  4  6
3   3  6  9
4   4  8 12
5   5 10 15
6   0  6 12
7   7 14 21
8   8 16 24
9   9 18 27
10 10 20 30

    a  b  c
1   1  2  3
2   2  4  6
3   3  6  9
4   4  8 12
5   5 10 15
6   NA  6 12
7   7 14 21
8   8 16 24
9   9 18 27
10 10 20 30

我不确定apply(..., cumsum) 是不是一个好的选择,您可以提供替代方法。

【问题讨论】:

    标签: r cumsum


    【解决方案1】:

    Simon's 绝对是最简单的。我很惊讶地从这个练习中学到了一些东西: 1. cumsum 没有 na.rm 参数 2.sum(NA, na.rm=TRUE)等于0

    这是使我得到相同解决方案的代码:

    cumsum.alt <- function(x){
        res <- NaN*seq(x)
        for(i in seq(x)){
            res[i] <- sum(x[1:i], na.rm=TRUE)
        }
        res
    }
    
    t(apply(data, 1, cumsum.alt))
    

    要返回 NA,可以稍作修改:

    cumsum.alt <- function(x){
        res <- NaN*seq(x)
        for(i in seq(x)){
            if(sum(is.na(x[1])) == i){
                res[i] <- NaN
            } else {
                res[i] <- sum(x[1:i], na.rm=TRUE)
            }
        }
        res
    }
    
    t(apply(data, 1, cumsum.alt))
    

    【讨论】:

    • 您好,感谢您的详细回答。我还有一个问题是,如果我想在 apply() 中计算 sum 而不是 cumsum,我该如何添加参数 na.rm=TRUE?
    • apply( data , 1 , sum , na.rm = TRUE )
    • 哦。同时得到 cumsum 的错误。再次感谢您的温柔帮助。
    【解决方案2】:

    鉴于您想要的结果(您不介意 NA 变为 0),我想最简单的方法是首先使用 is.na 删除 NA 值,然后像以前一样继续。

    data[ is.na(data) ] <- 0
    data.frame(t(apply(data,1,cumsum)))
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2018-04-13
      • 1970-01-01
      • 2017-09-02
      • 2015-04-30
      • 2017-06-12
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多