【问题标题】:(Using a custom function to) Sum above N rows in a datatable (dataframe) by groups(使用自定义函数)按组对数据表(数据框)中的 N 行以上求和
【发布时间】:2017-05-28 14:19:13
【问题描述】:

我需要一个函数,按组对数据框(数据表)中的上述 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 在 sapply 中工作,那就太好了)

【问题讨论】:

    标签: r datatable sapply


    【解决方案1】:

    对于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
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多