1

我必须根据 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 的总和。

谢谢你的帮助

4

2 回答 2

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
于 2021-03-16T20:25:03.240 回答
1

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 包(v0.3.0)创建于 2021-03-16 **或

于 2021-03-16T21:31:20.843 回答