我试图让函数按组返回统计信息,如下所示。 为了按组进行统计,我在此功能代码中使用了子集。 但是,当论证“' y'适用于'子集'。 我怎么解决这个问题?我等你的智慧。 它确定可以使用tapply,但我的目的是使功能。 谢谢。
sbyg<-function(dt,grp,y) {
# dt=data.frame, grp=group variable, y=value variable
ng<-length(unique(grp))
x<-as.vector(unique(grp))
statis<-matrix(nrow=ng,ncol=6)
for (i in 1:ng) {
dta<-dt[grp==x[i],]
attach(dta)
statis[i,1]<-nrow(dta) # 건수
statis[i,2]<-colSums(!is.na(dta))[1] # nonmiss건수
statis[i,3]<-mean(dta[,y],na.rm=TRUE) # 평균
statis[i,4]<-median(dta[,y],na.rm=TRUE) # 중위수
statis[i,5]<-min(dta[,y],na.rm=TRUE)
statis[i,6]<-max(dta[,y],na.rm=TRUE)
detach(dta)
}
rownames(statis)<-x
colnames(statis)<-c("count","nonmiss","mean","median","min","max")
statis
}
sbyg(iris,Species,Sepal.Length) # error occurs
答案 0 :(得分:1)
你对函数的调用应该是:
sbyg(iris,"Species","Sepal.Length")
除非iris是data.table
对象(默认情况下不是)。
编辑:修改功能:
sbyg<-function(dt,grp,y) {
# dt=iris ; grp="Species"; y="Sepal.Length"
ng<-length(unique(dt[, grp]))
x<-as.vector(unique(dt[, grp]))
statis<-matrix(nrow=ng,ncol=6)
for (i in 1:ng) { # i <- 1
dta<-dt[dt[, grp]==x[i],]
statis[i,1]<-nrow(dta) # 건수
statis[i,2]<-colSums(!is.na(dta))[1] # nonmiss건수
statis[i,3]<-mean(dta[,y],na.rm=TRUE) # 평균
statis[i,4]<-median(dta[,y],na.rm=TRUE) # 중위수
statis[i,5]<-min(dta[,y],na.rm=TRUE)
statis[i,6]<-max(dta[,y],na.rm=TRUE)
}
rownames(statis)<-x
colnames(statis)<-c("count","nonmiss","mean","median","min","max")
statis
}
但这不是最佳功能。最好的方法是使用tapply
。