【问题标题】:Summing values in a vector based on duplicate values in another R根据另一个 R 中的重复值对向量中的值求和
【发布时间】:2014-09-27 07:14:21
【问题描述】:

假设我在下面有两个向量:

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)

我该怎么做呢?

【问题讨论】:

    标签: r vector sum duplicates unique


    【解决方案1】:

    我对@9​​87654321@做了一些事情:

    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
    

    【讨论】:

      【解决方案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 进行分组,对于每个组,我们使用:= 运算符分配rs,如上所示,该运算符通过引用进行修改。 .N 是一个特殊的内部变量,它保存每个组的观察次数。

      .N=1,意味着只有一个观察,我们仍然计算rs,但它被设计成不修改任何东西。 sumrep 是非常便宜的操作,因此即使在不必要的情况下我们也可以进行计算。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2016-07-11
        • 1970-01-01
        相关资源
        最近更新 更多