用户定义函数中的错误,它按组生成统计信息

时间:2016-02-04 11:11:12

标签: r function arguments subset

我试图让函数按组返回统计信息,如下所示。 为了按组进行统计,我在此功能代码中使用了子集。 但是,当论证“' 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

1 个答案:

答案 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