使用 R - 按列拆分,然后对每个拆分的结果求和

Using R -split by column and then sum the result of each split

还有其他类似的问题,但很多都没有答案,有些提供了我无法更新的已弃用信息。我找不到答案。我有一个包含 1100 行和 3 列的数据框。我可以按第一列(称为 HUC8)中的名称成功拆分行,但随后我想对 each split.

中第三列的结果求和
library(rio)
library(tidyverse)
library(data.table)

这是拆分数据的缩写dput

    > dput(splitByHUCs)
list(bcc1_45Fall_1020004 = structure(list(HUC8 = c("bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004", 
"bcc1_45Fall_1020004", "bcc1_45Fall_1020004", "bcc1_45Fall_1020004"
), YEAR = 1961:2015, RO_MM = c(112, 243.7, 233.3, 190.3, 200.1, 
220.8, 130.4, 90, 211.2, 157.6, 221, 223.5, 166.7, 60, 144.8, 
150.6, 129.9, 223.4, 235.3, 143.4, 55.4, 214.8, 217.1, 126.5, 
106.7, 262, 285.5, 244.6, 86.8, 202.2, 196.8, 104.3, 222.9, 231.8, 
106.3, 190.4, 172, 181.5, 212, 191.4, 180.4, 122.4, 164.4, 142, 
165.1, 185, 121.4, 180.1, 193.9, 173.2, 179.7, 175.2, 259.2, 
130.2, 281.9)), row.names = c(NA, -55L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x000001e441191ef0>), 
....
    mricgcm3_45Fall_1020004 = structure(list(HUC8 = c("mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", 
    "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004", "mricgcm3_45Fall_1020004"
    ), YEAR = 1961:2015, RO_MM = c(77.2, 111.5, 247.4, 237.5, 
    186.3, 244.7, 102.9, 89.9, 270.2, 204.1, 88.6, 167.1, 172, 
    187.1, 76.8, 127.2, 181.1, 219.2, 165.9, 207.7, 109.7, 228.9, 
    122.9, 296, 118.7, 141.5, 130.3, 184.4, 245, 202.6, 244.8, 
    96.3, 225.8, 186.7, 224.8, 89.5, 241.5, 178.8, 193, 218.2, 
    168.7, 190, 123.1, 217.1, 176.8, 251.9, 157.4, 163.8, 119.5, 
    191.5, 129.1, 261.6, 298.8, 202.8, 197.5)), row.names = c(NA, 
    -55L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001e441191ef0>), 
    noresm1m_45Fall_1020004 = structure(list(HUC8 = c("noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", 
    "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004", "noresm1m_45Fall_1020004"
    ), YEAR = 1961:2015, RO_MM = c(108.8, 203.3, 124.2, 116.2, 
    148.3, 166.8, 269.8, 143.9, 118.2, 145.9, 212.2, 125.7, 103.4, 
    64.8, 165.9, 190.2, 196.8, 152.8, 175.6, 132.5, 192, 132.4, 
    199.2, 282.2, 195.5, 196.5, 207.1, 266.5, 183.5, 233, 104.9, 
    229.6, 71.5, 149.3, 133.6, 204.8, 114.5, 182.3, 193.3, 144.1, 
    206.9, 245.6, 167.7, 195.1, 150.4, 172.6, 145.7, 189.5, 93.6, 
    185.3, 289, 246.4, 104.5, 90.3, 272.1)), row.names = c(NA, 
    -55L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001e441191ef0>))

我试过:

colSums(splitByHUCs[ , c(3)])

得到:splitByHUCs[ c(3)] 错误:维数不正确

尝试过:

lapply(splitByHUCs, function(x) 
   x[sum(m$RO_MM)])

得到:

$bcc1_45Fall_1020004
   HUC8 YEAR RO_MM
1: <NA>   NA    NA

$bcc1_M_45Fall_1020004
   HUC8 YEAR RO_MM
1: <NA>   NA    NA

$bnuesm_45Fall_1020004
   HUC8 YEAR RO_MM
1: <NA>   NA    NA, etc...

尝试过:

apply(splitByHUCs, 3, sum)

得到: apply(splitByHUCs, 3, sum) 错误:dim(X) 的长度必须为正数

我也尝试将“splitsum/summarise/colSum” 或其他任何东西 - 我都试过了 - 在更大的,各种排列的未拆分数据框,但大多数情况下我得到了所有 1100 行的总和,或者什么都没有。

这是一个可重现的数据集:

HUC8, YEAR, RO_MM
bcc1_45Fall_1020004, 1961, 112
bcc1_45Fall_1020004, 1962, 243.7
bcc1_45Fall_1020004, 1963, 233.3
bcc1_45Fall_1020004, 1964, 190.3
bcc1_45Fall_1020004, 1965, 200.1
bcc1_45Fall_1020004, 1966, 220.8
bcc1_45Fall_1020004, 1967, 130.4
bcc1_45Fall_1020004, 1968, 90
bcc1_45Fall_1020004, 1969, 211.2
HUC8, YEAR, RO_MM
inmcm4_45Fall_1020004, 1961, 137.7
inmcm4_45Fall_1020004, 1962, 178.3
inmcm4_45Fall_1020004, 1963, 100.2
inmcm4_45Fall_1020004, 1964, 94
inmcm4_45Fall_1020004, 1965, 226.5
inmcm4_45Fall_1020004, 1966, 134.4
inmcm4_45Fall_1020004, 1967, 284.4
inmcm4_45Fall_1020004, 1968, 100.4
inmcm4_45Fall_1020004, 1969, 238.9
HUC8, YEAR, RO_MM
noresm1m_45Fall_1020004, 1961, 108.8
noresm1m_45Fall_1020004, 1962, 203.3
noresm1m_45Fall_1020004, 1963, 124.2
noresm1m_45Fall_1020004, 1964, 116.2
noresm1m_45Fall_1020004, 1965, 148.3
noresm1m_45Fall_1020004, 1966, 166.8
noresm1m_45Fall_1020004, 1967, 269.8
noresm1m_45Fall_1020004, 1968, 143.9
noresm1m_45Fall_1020004, 1969, 118.2

我需要每个命名组的 RO_MM 数据的 sum。每组有 139 个,而不是 10 个(如上),如果有帮助的话。

您可以使用 sapply -

sapply(splitByHUCs, function(x) sum(x$RO_MM, na.rm = TRUE))

#    bcc1_45Fall_1020004 mricgcm3_45Fall_1020004 noresm1m_45Fall_1020004 
#                 9753.1                  9893.4                  9435.8 

或者 purrr 选项将是 map_dbl -

purrr::map_dbl(splitByHUCs, ~sum(.x$RO_MM, na.rm = TRUE))