我需要一个函数,按组对数据帧(数据表(中的上述 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