【问题标题】:Summing by groups of rows in R按 R 中的行组求和
【发布时间】:2015-03-23 03:39:47
【问题描述】:

这是一个有点难以命名的问题,因此欢迎编辑。数据如下所示:

mat =         

     [,1]
 [1,] 9.586352e-04
 [2,]           NA
 [3,] 2.605841e-03
 [4,] 7.868957e-05
 [5,] 1.000000e+00
 [6,]           NA
 [7,] 8.208500e-02
 [8,] 2.605841e-03
 [9,] 7.868957e-05
[10,] 1.000000e+00
[11,] 9.586352e-04
[12,] 8.208500e-02
[13,] 2.605841e-03
[14,] 7.868957e-05
[15,] 1.000000e+00

我想对每 5 个元素求和,所以因为有 15 个,所以我返回的向量的长度应该是 3. (15/3)。因此,例如,只需将 NA 计为 0。

我该怎么做?

我也想忽略 NA 的

【问题讨论】:

  • 能否请您发布代码以用值填充垫子? mat 是矩阵吗?
  • "vapply(split(EXPnumerator, rep(1:3, each = 5)), sum, 1L) 中的错误:值必须是“整数”类型,但 FUN(X[[1] ]) 结果是类型 'double' 另外:警告消息:在 split.default(EXPnumerator, rep(1:3, each = 5)) 中:数据长度不是拆分变量的倍数"
  • 1 2 3 0.007817522 0.000000000 0.000000000 警告信息:在 split.default(mat, rep(1:3, each = 5)) 中:数据长度不是拆分变量的倍数
  • 对不起,它有效,但前两个返回 NA。
  • 1 2 3 NA NA 1.085728

标签: r matrix sum apply


【解决方案1】:

sum 函数有一个 na.rm 选项。

dfsum <- numeric()
i <- 1
j <- 1
while (i < nrow(df)) { 
    dfsum[j] <- sum(df[i,2] : df [i+4,2], na.rm=TRUE)
    i <- i+5
    j <- j+ 1
}

【讨论】:

    【解决方案2】:
    m <- matrix(1:15, ncol = 1)
    m[cbind(c(3,7),c(1, 1))] <- NA
    
    library(zoo)
    rollapply(m, sum, width = 5, by = 5, na.rm = TRUE)
         [,1]
    [1,]   12
    [2,]   33
    [3,]   65
    

    【讨论】:

      【解决方案3】:

      你可以使用tapply()

      mat <- matrix(c(1, 2, NA, 4:6, NA, 8:15))
      ## set up a grouping vector
      grp <- rep(1:(nrow(mat)/5), each = 5)
      ## compute group sums
      tapply(mat, grp, sum, na.rm = TRUE)
      #  1  2  3 
      # 12 33 65   
      

      效率较低的选项涉及split()vapply()

      vapply(split(mat, grp), sum, 1, na.rm = TRUE)
      #  1  2  3 
      # 12 33 65 
      

      【讨论】:

      • 使用rep(1:(nrow(mat)/5), each=5)而不是rep(1:3, each = 5)会更好吗?
      • 是的,这样概括起来会更好
      【解决方案4】:

      这是?rowsum的理想选择,应该很快

      使用 RStudent 的数据

      rowsum(m, rep(1:3, each=5), na.rm=TRUE)
      

      第二个参数group 定义了应用总和的行。更一般地说,组参数可以定义为rep(1:nrow(m), each=5, length=nrow(m))(如果应用于向量,则为nrowlength

      【讨论】:

        【解决方案5】:

        使用dplyr

        library(dplyr)
        mat <- matrix(c(1, 2, NA, 4:6, NA, 8:15))
        df <- data.frame(mat)
        
        df %>%
          mutate(group = rep(1:(n()/5), each=5)) %>%
          group_by(group) %>%
          summarise(mat = sum(mat, na.rm = TRUE))
        

        你得到:

        #Source: local data frame [3 x 2]
        
        #  group mat
        #1     1  12
        #2     2  33
        #3     3  65
        

        如果由于某些原因,您想将 NAs 替换为 0(因为您想要执行除 sum() 之外的其他操作,比如 mean()),您可以这样做:

        df %>%
          mutate(mat = ifelse(is.na(mat), 0, mat)) %>%
          mutate(group = rep(1:(n()/5), each=5)) %>%
          group_by(group) %>%
          summarise(mat = mean(mat))
        

        您将得到NAs 等于0 的结果(而不是在之前的建议中用na.rm = TRUE 省略NA

        #Source: local data frame [3 x 2]
        
        #  group  mat
        #1     1  2.4
        #2     2  6.6
        #3     3 13.0
        

        【讨论】:

          猜你喜欢
          • 2020-06-20
          • 1970-01-01
          • 2023-03-20
          • 2020-08-26
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          • 2021-01-29
          相关资源
          最近更新 更多