r语言 - (使用自定义函数)按组对数据表(数据帧)中 N 行以上的行求和



我需要一个函数,按组对数据帧(数据表(中的上述 N+1 行求和。

向量的等效函数如下所示。(如果下面的功能效率低下,请原谅(

Function1<-function(x,N){
  y<-vector(length=length(x))
for (i in 1:length(x))
if (i<=N) 
  y[i]<-sum(x[1:i])
else if (i>N) 
  y[i]<-sum(x[(i-N):i])
return(y)}
Function1(c(1,2,3,4,5,6),3)
#[1] 1 3 6 10 14 18 # Sums previous (above) 4 values (rows)

我想将此功能与sapply一起使用,如下所示。

sapply(X=DF<-data.frame(A=c(1:10), B=2), FUN=Function1(N=3))

但不能......因为我无法弄清楚如何在函数中为 x 设置默认值。因此,我为 data.frame 构建了另一个函数。

Function2<-function(x, N)
 if(is.data.frame(x)) {
y<-data.frame()
for(j in 1:ncol(x))
  for(i in 1:nrow(x))
    if (i<=N) {
      y[i,j]<-sum(x[1:i,j])
    }   else if (i>N)  {
      y[i,j]<-sum(x[(i-N):i,j])}
return(y)}
DF<-data.frame(A=c(1:10), B=2)
Function2(DF, 2)
#   V1 V2
1   1  2
2   3  4
3   6  6
4   9  6
5  12  6
6  15  6
7  18  6
8  21  6
9  24  6
10 27  6

但是,我仍然需要按组执行此操作。例如,对于以下具有字符列的数据框。

DF<-data.frame(Name=rep(c("A","B"),each=5), A=c(1:10), B=2)

我想按组"名称"应用我的函数 - 这将导致。

A   1  2
A   3  4
A   6  6
A   9  6
A  12  6
B   6  2
B  13  4
B  21  6
B  24  6
B  27  6

#Perform function2 separately for group A and B.

我希望将函数与data.table包一起使用(by=Groups(,但无法弄清楚如何。

最好的

方法是什么?(另外,如果我能学习如何让我的 Function1 在 sapply 中工作,那就太好了(

使用 data.table ,我们按 'Name' 分组,遍历 .SDcols 中指定的感兴趣列(这里所有列都是感兴趣的,所以我们没有指定它(并应用Function1

library(data.table)
setDT(DF)[, lapply(.SD, Function1, 2), Name]
#    Name  A B
# 1:    A  1 2
# 2:    A  3 4
# 3:    A  6 6
# 4:    A  9 6
# 5:    A 12 6
# 6:    B  6 2
# 7:    B 13 4
# 8:    B 21 6
# 9:    B 24 6
#10:    B 27 6

最新更新