R 对连续重复的奇数行求和,并除去除第一行以外的所有行

R 对连续重复的奇数行求和,并除去除第一行以外的所有行,r,R,我被一个问题困住了——如何对连续重复的奇数行求和并除去除第一行以外的所有行。我已经知道了如何求连续重复行的和,并删除除第一行以外的所有行(链接:)。但是在这个项目中,我想对连续重复的奇数行求和,但不是对所有连续重复行求和 ia<-c(1,1,2,NA,2,1,1,1,1,2,1,2) time<-c(4.5,2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3) a<-as.data.frame(cbind(ia, time))

我被一个问题困住了——如何对连续重复的奇数行求和并除去除第一行以外的所有行。我已经知道了如何求连续重复行的和,并删除除第一行以外的所有行(链接:)。但是在这个项目中,我想对连续重复的奇数行求和,但不是对所有连续重复行求和

 ia<-c(1,1,2,NA,2,1,1,1,1,2,1,2)
 time<-c(4.5,2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3)
 a<-as.data.frame(cbind(ia, time))

  a
   ia time
1   1  4.5
2   1  2.4
3   2  3.6
5   2  1.2
6   1  4.9
7   1  6.4
8   1  4.4
9   1  4.7
10  2  7.3
11  1  2.3
12  2  4.3

to 

 a
   ia time
1   1  6.9
3   2  3.6
5   2  1.2
6   1  20.4
10  2  7.3
11  1  2.3
12  2  4.3
ia%
分组依据(分组=总和(变化),ia)%>%
#这部分
总结(时间=总和(时间))

您可以尝试使用
数据。表
如下:

library(data.table)
ia <- c(1,1,2,NA,2,1,1,1,1,2,1,2)
time <- c(4.5,2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3)
a <- data.table(ia, time)
a[, sum(time), by=.(ia, rleid(!ia %% 2 == 0))]

一种可能性是:

a %>%
 group_by(grp = with(rle(ia), rep(seq_along(lengths), lengths))) %>%
 mutate(grp2 = ia %/% 2 == 0,
        time = sum(time)) %>%
 filter(!grp2 | (grp2 & row_number() == 1)) %>%
 ungroup() %>%
 select(-grp, -grp2)

      ia  time
  <dbl> <dbl>
1     1   6.9
2     2   3.6
3     2   1.2
4     1  20.4
5     2   7.3
6     1   2.3
7     2   4.3
a%>%
分组依据(grp=具有(rle(ia)、代表(沿(长度)、长度)的顺序))%>%
突变(grp2=ia%/%2==0,
时间=总和(时间))%>%
过滤器(!grp2 |(grp2&row_number()==1))%>%
解组()%>%
选择(-grp,-grp2)
ia时间
1     1   6.9
2     2   3.6
3     2   1.2
4     1  20.4
5     2   7.3
6     1   2.3
7     2   4.3

太棒了!谢谢,帕特里克,如果“时间”与列表长度相同。我怎么做?例如,当您在data.table中将列表指定为列时,您可以执行
time2再次感谢。可能有一些误导。你能看看下面的问题吗?我提出了一个描述更新请求的新问题。谢谢tmfmnk和Patrik_P。我还有其他问题。如果“时间”与列表长度相同。我怎么做?比如时间
##   ia rleid   V1
##1:  1     1  6.9
##2:  2     2  3.6
##3: NA     3  1.5
##4:  2     4  1.2
##5:  1     5 20.4
##6:  2     6  7.3
##7:  1     7  2.3
##8:  2     8  4.3
a %>%
 group_by(grp = with(rle(ia), rep(seq_along(lengths), lengths))) %>%
 mutate(grp2 = ia %/% 2 == 0,
        time = sum(time)) %>%
 filter(!grp2 | (grp2 & row_number() == 1)) %>%
 ungroup() %>%
 select(-grp, -grp2)

      ia  time
  <dbl> <dbl>
1     1   6.9
2     2   3.6
3     2   1.2
4     1  20.4
5     2   7.3
6     1   2.3
7     2   4.3