假设我有以下两个向量:
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)
我将如何做到这一点?
答案 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
只表示一次观察时,我们仍会计算r
和s
,但它的目的不是修改任何内容。 sum
和rep
是非常便宜的操作,因此即使他们没有必要也可以计算。
答案 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