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