【问题标题】:Sum column based on condition in another columns in R根据R中另一列中的条件对列求和
【发布时间】:2021-03-16 20:23:50
【问题描述】:

我必须根据 if 语句对列的值求和。 这是我的代码:

a <- c(1,2,3)
b <- c(2,2,3)
f <- c(1,2,3)
df <- data.frame(a,b,f)
df
for (i in 1:nrow(df)){
  if (df$a[i] == df$b[i]){
    w <- sum(df$f)
  }
}

我的结果是 6,而应该是 5,即 f[2]=2 + f[3]=3 的总和。

感谢您的帮助

【问题讨论】:

    标签: r loops if-statement sum column-sum


    【解决方案1】:

    我们不需要循环

    with(df, sum(f[a == b]))
    #[1] 5
    

    或者为了更快的子集和求和,可以使用collapse

    library(collapse)
    fsum(fsubset(df, a == b)$f)
    #[1] 5
    

    在循环中,可以改成

    w <- 0
    for(i in seq_len(nrow(df))) {
        if(df$a[i] == df$b[i]) {
            w <- w + df$f[i]
       }
     }
    
    w
    #[1] 5
    

    【讨论】:

      【解决方案2】:

      data.table 方法:

      a <- c(1,2,3)
      b <- c(2,2,3)
      f <- c(1,2,3)
      df <- data.frame(a,b,f)
      
      library(data.table)
      
      setDT(df)
      
      df[,.(f_sum = sum(f[a==b]))][]
      
      # Returns a data.table object:
      
      #>    f_sum
      #> 1:     5
      
      # OR 
      
      df[,(f = sum(f[a==b]))][]
      
      # Returns a vector:
      
      #> [1] 5
      
      

      reprex package (v0.3.0) 于 2021-03-16 创建 **或

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2021-05-12
        • 1970-01-01
        • 2021-01-25
        相关资源
        最近更新 更多