基于另一个R中的重复值对向量中的值求和

时间:2014-08-04 18:17:24

标签: r vector sum duplicates unique

假设我有以下两个向量:

r<-c(2,2,4,2,NA,6,8,8,9,NA,2,3)
s<-c(50,57,43,2,NA,11,62,35,9,NA,61,78)

我想要做的是将s向量中的所有值相加,对应于哪个值在r向量中重复,从而计算唯一性。例如,在r向量中,值2和8分别在1,2,4,11位置和7,8位置处重复。所以我想总结s [1],s [2],s [4]和s [11]并将结果放在s [11]位置,并将s [7]和s [8]和把它放在s [8]位置,导致

r<-c(NA,NA,4,NA,NA,6,NA,8,9,NA,2,3)
s<-c(NA,NA,43,NA,NA,11,NA,97,9,NA,170,78)

我将如何做到这一点?

2 个答案:

答案 0 :(得分:2)

使用data.table包:

DT = data.table(r,s)
DT[, `:=`(r=c(rep(NA, .N-1L), r[1L]), 
          s=c(rep(NA, .N-1L), sum(s))
         ), 
by=r]

> DT
#      r   s
#  1: NA  NA
#  2: NA  NA
#  3:  4  43
#  4: NA  NA
#  5: NA  NA
#  6:  6  11
#  7: NA  NA
#  8:  8  97
#  9:  9   9
# 10: NA  NA
# 11:  2 170
# 12:  3  78

我们按列r分组,对于每个组,我们使用r运算符分配s:=,如上所示,该运算符通过引用进行修改。 .N是一个特殊的内部变量,它保存每个组的观察数。

.N=1只表示一次观察时,我们仍会计算rs,但它的目的不是修改任何内容。 sumrep是非常便宜的操作,因此即使他们没有必要也可以计算。

答案 1 :(得分:1)

我使用dplyr做了一些事情:

df<-data.frame(r,s)

library(dplyr)
temp<-df%>% 
  group_by(r)%>% 
  mutate(total=sum(s), last=duplicated(r, fromLast = TRUE), 
          isna=is.na(r), true=(last==TRUE | isna==TRUE)) 

temp<-as.data.frame(unclass(temp))
ifelse(temp$true==FALSE, temp$s<-temp$total, temp$s<-NA)


 [1]  NA  NA  43  NA  NA  11  NA  97   9  NA 170  78