如何返回每个组的最后一个匹配条件行?

时间:2019-07-03 10:05:48

标签: r group-by tail

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

1:大功率运行 0.5:低功耗运行 0:无操作 -1:操作结束

我有一个由这些数据帧组成的machinas列表(每个machina-一个很小的样本):

    *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

我该怎么办?

2 个答案:

答案 0 :(得分:2)

使用dplyr的一种方法是从数据filter group_byIndx的{​​{1}}值sum到操作结束行在Operation2为1的最后一次出现到最后一行之间发生。我们使用Operation1值找到1的最后一次出现。

cumsum

或者找到最后一次出现的另一种方法是使用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 which

max

数据

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

答案 1 :(得分:0)

在基数R中我们可以做

do.call(rbind, by(d, d[[1]], function(x) 
  c(Indx=x[[1]][1], 
    N.1.Operation.length=sum(x[[3]][head(max(which(x[[2]] > .5)):nrow(x), -1)]))))
#   Indx N.1.Operation.length
# 1    1                  137
# 2    2                   92

数据

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