r - 计算 R 中数据框中具有 1 和 0 的列的行总和,想要 0 之间的连续 1 之间的总和
问题描述
输入数据帧可重现示例:
onoff = c(0,1,1,1,0,0,1,1,1,0)
amount = c(0,0.5,0,0.6,0,0,0.5,0.6,0.7,0)
mockdata = data.frame(onoff, amount)
它看起来像这样。
onoff
我想对0 之间为 1的行序列求和。所以在这个例子中,我有两组和,第一组在第 2 行和第 4 行之间,第二组在第 7 行和第 9 行之间。所以我会输出两个数字,1.1 和 1.8。
不知道如何做到这一点,任何帮助将不胜感激!
解决方案
我们可以使用rleid
fromdata.table
创建一个分组列,然后使用它来获取sum
library(dplyr)
library(data.table)
mockdata %>%
group_by(grp = rleid(onoff)) %>%
mutate(Sum = sum(amount) * onoff)
# A tibble: 10 x 4
# Groups: grp [5]
# onoff amount grp Sum
# <dbl> <dbl> <int> <dbl>
# 1 0 0 1 0
# 2 1 0.5 2 1.1
# 3 1 0 2 1.1
# 4 1 0.6 2 1.1
# 5 0 0 3 0
# 6 0 0 3 0
# 7 1 0.5 4 1.8
# 8 1 0.6 4 1.8
# 9 1 0.7 4 1.8
#10 0 0 5 0
如果我们需要汇总输出
mockdata %>%
group_by(grp = rleid(onoff)) %>%
filter(onoff == 1) %>%
summarise(amount = sum(amount))
推荐阅读
- c++ - Gstreamer 与 UDP 网络捕获->修改->流管道错误
- c++ - 如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行
- ios - 在 swift 中遇到关于暗模式下自定义颜色的问题
- mongodb - 我们如何将数据从 MongoDB 摄取到 H2o 集群?
- datomic - datomic 中的简单反向导航
- powerbi - 如何使用power bi找到昨天登录但今天没有登录的人?
- cassandra - 在 cassandra.yaml 中获取超过 max_value_size_in_mb 的值的错误
- django - Angular 从 Django 服务器的响应中接收 Html 而不是 JSON
- python - 将文本文件的特定部分与另一个文本文件进行比较
- javascript - 将 HTML 转换为 PDF 时自动保存到 Cpanel 中的预定义文件夹