首页 > 解决方案 > 根据另一列的值将一列相加

问题描述

我有一个如下所示的数据框。

df <- data.frame(mnth = c("jan", "feb", "feb", "mar", "mar",
                          "mar", "apr", "apr", "apr", "apr", 
                          "may", "may", "may", "may", "may"),
                 n = c(1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5),
                 value = c(5, 1, 3, 2, 8, 0, 6, 0, 2, 7, 2, 1, 4, 2, 6))

我想为value字段的每个值在字段中添加相应的数字n

在这种情况下,答案应该是:
16、12、6、9、6

16 = 5 + 1 + 2 + 6 + 2  # all rows where 'n' = 1
12 = 3 + 8 + 0 + 1      # all rows where 'n' = 2
6  = 0 + 2 + 4          # all rows where 'n' = 3
9  = 7 + 2              # all rows where 'n' = 4
6                       # all rows where 'n' = 5

如何编写 for 循环来添加 R 中的数字?

标签: rloops

解决方案


这是一个使用data.table和的解决方案merge- 非常简单:

library(data.table)
dt1 <- as.data.table(df)

dt2 <- dt2 <- data.table(mnth = c('jan', 'feb', 'mar', 'apr', 'may'), 
                         N = c(16, 12, 6, 9, 6))

> merge(dt, dt2, by = 'mnth', all = T, fill = T)
    mnth n value  N
 1:  apr 1     6  9
 2:  apr 2     0  9
 3:  apr 3     2  9
 4:  apr 4     7  9
 5:  feb 1     1 12
 6:  feb 2     3 12
 7:  jan 1     5 16
 8:  mar 1     2  6
 9:  mar 2     8  6
10:  mar 3     0  6
11:  may 1     2  6
12:  may 2     1  6
13:  may 3     4  6
14:  may 4     2  6
15:  may 5     6  6

如果您只想要观察计数和列总和,您可以使用以下by参数data.table

> dt[, .(nsum = sum(n), valsum = sum(value), obs = .N), by = mnth]
   mnth nsum valsum obs
1:  jan    1      5   1
2:  feb    3      4   2
3:  mar    6     10   3
4:  apr   10     15   4
5:  may   15     15   5

推荐阅读