(使用自定义函数)按组分组数据表(数据帧)中的N行以上

时间:2017-05-28 14:19:13

标签: r datatable sapply

我需要一个函数,按组对数据帧(数据表)中的上述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中工作,那将是非常好的)

1 个答案:

答案 0 :(得分:1)

使用data.table,我们按名称&#39;分组,循环浏览.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