簡體   English   中英

按R中的行組求和

[英]Summing by groups of rows in R

這是一個很難回答的標題問題,因此歡迎編輯。 數據如下所示:

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

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

您可以使用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 

這對於?rowsum是理想的,它應該很快

使用RStudent的數據

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

第二個參數group定義了將總和應用到的行。 更一般而言,可以將組參數定義為rep(1:nrow(m), each=5, length=nrow(m)) (如果應用於向量,則以lengthnrow

使用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

如果由於某些原因,您想將NA替換為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))

您將獲得NA等於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

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM