R中SumIfs()的向量

R中SumIfs()的向量,r,excel,aggregate,user-defined-functions,sumifs,R,Excel,Aggregate,User Defined Functions,Sumifs,我希望通过为每个观测值创建条件平均值的平均if向量来模拟R中Excel的SumIfs()函数。我见过很多例子,它们使用aggregate()或setDT()来总结基于固定数量的数据帧。但是,我想根据数据框中每行的变量输入创建这些摘要的向量 以下是我的数据示例: > a <- c('c', 'a', 'b', 'a', 'c', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'b', 'a') > b <- c(6, 1, 1, 2, 1,

我希望通过为每个观测值创建条件平均值的平均if向量来模拟R中Excel的SumIfs()函数。我见过很多例子,它们使用
aggregate()
setDT()
来总结基于固定数量的数据帧。但是,我想根据数据框中每行的变量输入创建这些摘要的向量

以下是我的数据示例:

> a <- c('c', 'a', 'b', 'a', 'c', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'b', 'a')
> b <- c(6, 1, 1, 2, 1, 2, 2, 4, 3, 3, 5, 5, 4, 6, 6)
> c <- c(69.9, 21.2, 37, 25, 65.9, 33.1, 67, 28.4, 36, 67, 22, 37.9, 62.3, 30, 25)
> df <- data.frame(cbind(a, b, c))
> df$b <- as.numeric(as.character(df$b))
> df$c <- as.numeric(as.character(df$c))
> df
   a b    c
1  c 6 69.9
2  a 1 21.2
3  b 1 37.0
4  a 2 25.0
5  c 1 65.9
6  b 2 33.1
7  c 2 67.0
8  a 4 28.4
9  b 3 36.0
10 c 3 67.0
11 a 5 22.0
12 b 5 37.9
13 c 4 62.3
14 b 6 30.0
15 a 6 25.0

是否有一个功能我可以用来自动完成这项工作?谢谢你的帮助

您可以使用一个循环来准确地写出您是如何描述问题的:

n <- nrow(df)
d <- numeric(n)

for (i in seq_len(n)) {
  x <- df$a[i]
  y <- df$b[i]
  d[i] <- with(df, mean(c[a == x & y - 2 <= b & b < y]))
}

all.equal(d, df$d)
#> [1] TRUE

n这可以通过在SQL中使用左自联接以一种简单的方式完成。这将连接到
df的
u
实例的每一行
v
实例中满足
on
条件的
df
行,然后对其
c
值进行平均

library(sqldf)

sqldf("select u.*, avg(v.c) as d
       from df u left join df v
       on u.a = v.a and v.b between u.b-2 and u.b-1
       group by u.rowid")
给予:

   a b    c     d
1  c 6 69.9 62.30
2  a 1 21.2    NA
3  b 1 37.0    NA
4  a 2 25.0 21.20
5  c 1 65.9    NA
6  b 2 33.1 37.00
7  c 2 67.0 65.90
8  a 4 28.4 25.00
9  b 3 36.0 35.05
10 c 3 67.0 66.45
11 a 5 22.0 28.40
12 b 5 37.9 36.00
13 c 4 62.3 67.00
14 b 6 30.0 37.90
15 a 6 25.0 25.20

我只是想弄清楚如何使用
data.table
进行同样的连接。以前没有遇到过
sqldf
,非常酷。(+1)谢谢你们两位的帮助!这太完美了。
   a b    c     d
1  c 6 69.9 62.30
2  a 1 21.2    NA
3  b 1 37.0    NA
4  a 2 25.0 21.20
5  c 1 65.9    NA
6  b 2 33.1 37.00
7  c 2 67.0 65.90
8  a 4 28.4 25.00
9  b 3 36.0 35.05
10 c 3 67.0 66.45
11 a 5 22.0 28.40
12 b 5 37.9 36.00
13 c 4 62.3 67.00
14 b 6 30.0 37.90
15 a 6 25.0 25.20