[英](Using a custom function to) Sum above N rows in a datatable (dataframe) by groups
我需要一个函数,按组对数据帧(数据表)中的以上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正常运行,那将非常好)
使用data.table
,我们按“名称”分组,遍历.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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.