R将连续的重复行相加并除去第一行以外的所有行

LaN*_*Neu 2 r duplicates dataframe na

我遇到了一个可能很简单的问题 - 如何对连续的重复行进行求和并删除除第一行之外的所有行.并且,如果存在NA两个重复项之间(例如2,na,2),也可以将它们相加并删除除第一个条目之外的所有副本.到目前为止一切顺利,这是我的样本数据

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))
Run Code Online (Sandbox Code Playgroud)

样本输出

     a
   ia time
1   1  4.5
2   1  2.4
3   2  3.6
4  NA  1.5
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
Run Code Online (Sandbox Code Playgroud)

现在我想1.)对连续ia的"时间"列求和 - 即,如果数字1在彼此之后出现两次或更多次,则将时间相加,在我的情况下,这里将第一列和第二列的时间加到4.5+2.4.

2.)如果NA两个数字(ia列)之间存在相同的数字(i.e., ia = 2, NA, 2),那么也将所有这些时间相加.

3.)仅保留第一次出现ia,并删除其余部分.

最后,我希望得到这样的东西:

 a
       ia time
    1   1  6.9
    3   2  6.3
    6   1  20.4
    10  2  7.3
    11  1  2.3
    12  2  4.3
Run Code Online (Sandbox Code Playgroud)

我发现这是为了求和,但它没有考虑连续因素

aggregate(time~ia,data=a,FUN=sum)
Run Code Online (Sandbox Code Playgroud)

我发现这是为了删除

a[cumsum(rle(as.numeric(a[,1]))$lengths),]
Run Code Online (Sandbox Code Playgroud)

虽然rle方法保留了最后一个条目,但我想保留第一个条目.我也不知道如何处理NAs.

如果我有一个模式,1-NA-2那么NA不应该用它们中的任何一个计算,在这种情况下NA应该删除该行.

Col*_*vel 5

随着data.table(如RHertel建议的那样na.locf):

library(data.table)
library(zoo)

setDT(a)[na.locf(ia, fromLast=T)==na.locf(ia), sum(time), cumsum(c(T,!!diff(na.locf(ia))))]
#   id   V1
#1:  1  6.9
#2:  2  6.3
#3:  3 20.4
#4:  4  7.3
#5:  5  2.3
#6:  6  4.3
Run Code Online (Sandbox Code Playgroud)