(使用自定义函数)按组对数据表(数据框)中的 N 行求和
(Using a custom function to) Sum above N rows in a datatable (dataframe) by groups
我需要一个函数来按组对数据帧(数据表)中的上述 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.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)
我想按组应用我的函数 "Name" -- 这将导致。
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 包(按=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
我需要一个函数来按组对数据帧(数据表)中的上述 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.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)
我想按组应用我的函数 "Name" -- 这将导致。
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 包(按=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