首页 > 解决方案 > 如何返回每组的最后一个匹配条件行?

问题描述

我正在处理带有许多机器的文件。每个机器都在一个周期内工作(从-1到-1),我有一些操作参数:

1:高功率运行 0.5:低功率运行 0:无运行 -1:运行结束

我有一个包含这些数据框的机器列表(每个机器一个 - 这是一个非常小的样本):

    *Indx*  *N°1 Operation*  *N°1 Operation length*
       1           1                450
       1          0.5                84
       1           0                 48
       1           1                  4
       1          0.5                 4
       1           1                123
       1          0.5                14
       1          -1                 45
       2           1                471
       2           0                 47
       2          0.5                44
       2           0                145
       2          0.5                78
       2           1                 71
       2          0.5                19
       2           0                  2
       2          -1                 45

我想为每个组获取具有 1 个值的最后一行(高功率操作)。然后,我的目的是将最后一个高操作值到周期结束的长度相加。

期望的输出:

*Indx*    *N°1 Operation length*
  1                  123+14
  2                  71+19+2

我怎样才能做到这一点?

标签: rgroup-bytail

解决方案


使用dplyr一种方法是filter从数据中结束操作行,group_by Indx并且在最后一次出现之间出现sum的值是 1 到最后一行。我们使用value 找到最后一次出现的 1。Operation2Operation1cumsum

library(dplyr)

df %>%
  filter(Operation1 != -1) %>%
  group_by(Indx) %>%
  summarise(Oplength = sum(Operation2[cumsum(Operation1 == 1) == 
                                  max(cumsum(Operation1 == 1))]))

# A tibble: 2 x 2
#   Indx Oplength
#  <int>    <int>
#1     1      137
#2     2       92

或者另一种查找最后一次出现的方法是使用whichandmax

df %>%
  filter(Operation1 != -1) %>%
  group_by(Indx) %>%
  summarise(Oplength = sum(Operation2[max(which(Operation1 == 1)) : n()]))

数据

df <- structure(list(Indx = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), Operation1 = c(1, 0.5, 0, 1, 0.5, 
1, 0.5, -1, 1, 0, 0.5, 0, 0.5, 1, 0.5, 0, -1), Operation2 = c(450L, 
84L, 48L, 4L, 4L, 123L, 14L, 45L, 471L, 47L, 44L, 145L, 78L, 
71L, 19L, 2L, 45L)), class = "data.frame", row.names = c(NA, -17L))

推荐阅读