【发布时间】: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 中工作,那就太好了)
【问题讨论】: