如何将分位数功能添加到data.table?

时间:2019-05-03 16:29:06

标签: r data.table quantile

我正在开发一个函数,该函数在数据表上返回统计摘要。我想将分位数添加到失败的输出中。有想法吗?

tr <-data.table(industry=as.factor(c("a","a","a","b","b","b")), 
country=c("ch","gb", "us", "gb", "us", "us"), rat1=rnorm(100), rat2=rnorm(100))

SummaryStat <- function(tab.ratios, IDs, q.increment=0.05){ 
  tab.ratios <- melt(tab.ratios, id.vars = IDs)[variable %like% "rat"]
  output <- lapply(IDs, function(index){
    tab.ratios[, .(N=.N, NMISS=sum(is.na(value)), missing.perc=100 * sum(is.na(value)) / .N,
                    special.perc=100 * sum(value==1 | value==-1 | value==1000 | value == -1000) / .N,
                    zero.perc=100 * sum(value==0) / .N,
                    mean=mean(as.double(value), na.rm=TRUE), median=median(as.double(value), na.rm=TRUE),
                    var=var(value, na.rm=TRUE), SD=sqrt(var(value, na.rm=TRUE)),
                    min=min(value, na.rm=TRUE), max=max(value, na.rm=TRUE)), 
                    by=c("variable", index)] 
  })
  names(output) <- IDs
  return(output)
} 

SummaryStat(tr, c("industry", "country"))

如何将分位数添加到要返回的表中?

1 个答案:

答案 0 :(得分:0)

首先,我认为您需要更新示例,因为“ x_fin_rat”作为data.table中的一列不存在。因此,我仅对%like%参数使用“ rat1”,以使用提供的数据集测试您的功能。无论您遇到什么错误,因为quantile的值都是一个命名的数字矢量。因此,我认为不可能将其与您的单身人数统计信息简单地相加。我要做的只是分别计算分位数,然后以data.table方式合并它们。因此,这就是在您的函数中添加的代码:

SummaryStat <- function(tab.ratios, IDs, q.increment=0.05){ 
    tab.ratios <- melt(tab.ratios, id.vars = IDs)[variable %like% "x_fin_rat_"]
    output <- lapply(IDs, function(index){
    tab.ratios[, .(N=.N, NMISS=sum(is.na(value)), missing.perc=100 * sum(is.na(value)) / .N,
                special.perc=100 * sum(value==1 | value==-1 | value==1000 | value == -1000) / .N,
                zero.perc=100 * sum(value==0) / .N,
                mean=mean(as.double(value), na.rm=TRUE), median=median(as.double(value), na.rm=TRUE),
                var=var(value, na.rm=TRUE), SD=sqrt(var(value, na.rm=TRUE)),
                min=min(value, na.rm=TRUE), max=max(value, na.rm=TRUE)), 
                by=c("variable", index)][tab.ratios[,data.table(t(quantile(value,na.rm=T))),by=c("variable",index)],on=c("variable",index)]
              })
    names(output) <- IDs
    return(output)
} 

请注意,您需要首先转置quantile值以将其转换为行向量,然后将该结果转换为data.table以便进行合并。希望对您有所帮助,如果还有其他问题,请告诉我。祝你好运!