r - 根据另一列的值将一列相加
问题描述
我有一个如下所示的数据框。
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 中的数字?
解决方案
这是一个使用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
推荐阅读
- emgucv - EmguCV 等价于 Java mat.put(i, 0, mv)
- kotlin - Kotlin 单一分配过滤器和映射
- caching - Azure DevOps 管道任务从私有代理上的云下载缓存
- python - Python 从动态创建的模块中导入所有 *
- c# - 为什么 Ctrl+Shift+D0 不会触发 KeyDown ...我该怎么办?
- javascript - 具有高于 Number.MAX_SAFE_INTEGER 的值有什么意义?
- entity-framework - 使用不在 DbContext 中的子类查找
- conda - Conda `update --all` 防止降级
- r - 在 R 中下载 tidycensus 库时出错
- shopify - 在 Shopify 中使用 Porto 主题 3.6.3 如何关闭特定产品的添加到购物车?