繁体   English   中英

(使用自定义函数)按组将数据表(数据框)中N行以上的总和

[英](Using a custom function to) Sum above N rows in a datatable (dataframe) by groups

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

vector的等效函数如下所示。 (如果以下功能无效,请原谅我)

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.frames构建了另一个函数。

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正常运行,那将非常好)

使用data.table ,我们按“名称”分组,遍历.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM