基于数据帧同一行中不同列的值的累积总和(避免循环)

刷新

我有一个包含数十万行的数据框,但可以在下面举例说明:

> mydata
  ID TYPE HEIGHT WEIGHT
1 20    6    194   77.1
2 20    2    175   63.5
3 20    6    197   59.6
4 20    1    185   74.3
5 20    1    162   94.4
6 21    1    188   58.9
7 21    6    182   81.2
8 21    6    169   82.8
9 21    2    151   78.5

这是重现它的代码:

mydata <- data.frame(ID=c(20,20,20,20,20,21,21,21,21), 
                     TYPE=(c(6,2,6,1,1,1,6,6,2)), 
                     HEIGHT=c(194,175,197,185,162,188,182,169,151), 
                     WEIGHT=c(77.1,63.5,59.6,74.3,94.4,58.9,81.2,82.8,78.5))

我需要做的是:对每个ID,计算WEIGHTSby的总和TYPE但仅对那些具有HEIGHT高于当前行中所包含元素的元素(具有相同ID)进行计算

然后,新的数据框应再包含三列(每列一列TYPE),并最终应如下所示:

> mydata_new
  ID TYPE HEIGHT WEIGHT SUM.W.TYPE6 SUM.W.TYPE2 SUM.W.TYPE1
1 20    6    194   77.1        59.6         0.0         0.0
2 20    2    175   63.5       136.7         0.0        74.3
3 20    6    197   59.6         0.0         0.0         0.0
4 20    1    185   74.3       136.7         0.0         0.0
5 20    1    162   94.4       136.7        63.5        74.3
6 21    1    188   58.9         0.0         0.0         0.0
7 21    6    182   81.2         0.0         0.0        58.9
8 21    6    169   82.8        81.2         0.0        59.9
9 21    2    151   78.5       164.0         0.0        58.9

如果可能的话,我想避免遍历每一行,因为给定我的大量数据集,这将花费很长时间。有什么聪明的解决方案吗?或许用一些合适的软件包,如dplyrdata.table或简单地使用applysapply

我想了解如何基于同一行的不同列中的值创建一个累加和,但也取决于单独的分组(即TYPE)。

坦率

如操作说明中所述,累积总和在这里起作用:

library(data.table)
setDT(mydata)

ut = sort(unique(mydata$TYPE))
mydata[order(-HEIGHT), paste0("sum_",ut) :=  lapply(ut, 
  function(x) shift(cumsum( WEIGHT*(TYPE==x) ), fill=0) 
), by=ID]

   ID TYPE HEIGHT WEIGHT sum_1 sum_2 sum_6
1: 20    6    194   77.1   0.0   0.0  59.6
2: 20    2    175   63.5  74.3   0.0 136.7
3: 20    6    197   59.6   0.0   0.0   0.0
4: 20    1    185   74.3   0.0   0.0 136.7
5: 20    1    162   94.4  74.3  63.5 136.7
6: 21    1    188   58.9   0.0   0.0   0.0
7: 21    6    182   81.2  58.9   0.0   0.0
8: 21    6    169   82.8  58.9   0.0  81.2
9: 21    2    151   78.5  58.9   0.0 164.0

重复高度测量。到目前为止,这仅在每个ID内的所有高度都不同的情况下才有效(如OP的当前示例)。但是,OP在评论中提到高度可能会重复。感谢@DeanMacGregor,这是该情况的扩展:

# run the code above, and then...
mydata[order(-HEIGHT), paste0('sum_',ut) := 
  .SD[.N]
, by=.(ID,TYPE,HEIGHT), .SDcols=paste0('sum_',ut)]

或者by一步来做

ut = sort(unique(mydata$TYPE))
mydata[order(-HEIGHT), paste0("sum_",ut) := {
  sd = lapply(ut, function(x) shift(cumsum( WEIGHT*(TYPE==x) ), fill=0))
  setDT(sd)[, .SD[1L], by=.(HEIGHT,TYPE)][, c("HEIGHT","TYPE") := NULL]
}, by=ID]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

一个数据框中的列总和基于另一数据帧的行值

来自分类Dev

熊猫数据帧中同一行但不同列中单元格的乘法和

来自分类Dev

如何获得最大 基于数据帧中其他列的值,每一行的n周期值?

来自分类Dev

从数据场的n列中为每一行随机选择k个值,并将它们存储到同一数据帧的k列中

来自分类Dev

如何创建基于同一行中另一列的值命名的新列?

来自分类Dev

在列中查找值,然后返回同一行但不同列的值

来自分类Dev

避免使用循环来获取R中的行总和,在此我要在每一行的不同列上开始和停止总和

来自分类Dev

避免使用循环来获取R中的行总和,在此我要在每一行的不同列上开始和停止总和

来自分类Dev

对于同一行中循环的不同结束条件?

来自分类Dev

对于同一行中循环的不同结束条件?

来自分类Dev

为基于数组的列中的每个值多次返回同一行

来自分类Dev

如何遍历Pandas中的列值并基于同一行中多个列的值创建新的观察值?

来自分类Dev

从不同的列但在同一行中获取值,然后使用VBA将其添加到总和中

来自分类Dev

直到某行(行)的数据帧的累积总和

来自分类Dev

如何基于同一行中不同单元格中的数据禁用单元格中的内联编辑

来自分类Dev

如何在第一个数据帧中的另一个基于数据帧的列值中获取值的总和?

来自分类Dev

如何用R中同一行中的先前值替换数据帧中的任何NA

来自分类Dev

基于 Python 中另一个数据帧的行值从数据帧中获取列?

来自分类Dev

在同一行中显示具有不同值的相同列

来自分类Dev

通过搜索不同的列返回同一行中的值

来自分类Dev

在同一行中显示具有不同值的相同列

来自分类Dev

Excel根据同一行中不同列的值求和

来自分类Dev

如何在 Python 的同一行代码中过滤 2 个不同列(系列)的值?

来自分类Dev

MySQL - 如何按值分组并在同一行的不同列中显示

来自分类Dev

使用 APACHE POI 在同一行的不同列中打印值

来自分类Dev

如何选择同一行中不同公司的数据?

来自分类Dev

如何选择同一行中不同公司的数据?

来自分类Dev

在Pyspark中转换数据框(同一行,不同列)中的列表

来自分类Dev

如何根据酒店名称在同一行但在不同列中添加数据

Related 相关文章

  1. 1

    一个数据框中的列总和基于另一数据帧的行值

  2. 2

    熊猫数据帧中同一行但不同列中单元格的乘法和

  3. 3

    如何获得最大 基于数据帧中其他列的值,每一行的n周期值?

  4. 4

    从数据场的n列中为每一行随机选择k个值,并将它们存储到同一数据帧的k列中

  5. 5

    如何创建基于同一行中另一列的值命名的新列?

  6. 6

    在列中查找值,然后返回同一行但不同列的值

  7. 7

    避免使用循环来获取R中的行总和,在此我要在每一行的不同列上开始和停止总和

  8. 8

    避免使用循环来获取R中的行总和,在此我要在每一行的不同列上开始和停止总和

  9. 9

    对于同一行中循环的不同结束条件?

  10. 10

    对于同一行中循环的不同结束条件?

  11. 11

    为基于数组的列中的每个值多次返回同一行

  12. 12

    如何遍历Pandas中的列值并基于同一行中多个列的值创建新的观察值?

  13. 13

    从不同的列但在同一行中获取值,然后使用VBA将其添加到总和中

  14. 14

    直到某行(行)的数据帧的累积总和

  15. 15

    如何基于同一行中不同单元格中的数据禁用单元格中的内联编辑

  16. 16

    如何在第一个数据帧中的另一个基于数据帧的列值中获取值的总和?

  17. 17

    如何用R中同一行中的先前值替换数据帧中的任何NA

  18. 18

    基于 Python 中另一个数据帧的行值从数据帧中获取列?

  19. 19

    在同一行中显示具有不同值的相同列

  20. 20

    通过搜索不同的列返回同一行中的值

  21. 21

    在同一行中显示具有不同值的相同列

  22. 22

    Excel根据同一行中不同列的值求和

  23. 23

    如何在 Python 的同一行代码中过滤 2 个不同列(系列)的值?

  24. 24

    MySQL - 如何按值分组并在同一行的不同列中显示

  25. 25

    使用 APACHE POI 在同一行的不同列中打印值

  26. 26

    如何选择同一行中不同公司的数据?

  27. 27

    如何选择同一行中不同公司的数据?

  28. 28

    在Pyspark中转换数据框(同一行,不同列)中的列表

  29. 29

    如何根据酒店名称在同一行但在不同列中添加数据

热门标签

归档