在R中分组数据后使用用户定义的函数

时间:2017-04-05 17:05:49

标签: r group-by user-defined

我有一个函数检查大型数据帧中每列的零数。现在我想按类别分组后检查每个col中的零数字。 这是一个例子:

   zero_rate <- function(df) {
     z_rate_list <- sapply(df, function(x) {
      data.frame(
      n_zero=length(which(x==0)), 
      n=length(x), 
      z_rate=length(which(x==0))/length(x))
 })

      d <- data.frame(z_rate_list)
      d <- sapply(d, unlist)
      d <- as.data.frame(d)

      return(d)}

   df = data.frame(var1=c(1,0,NA,4,NA,6,7,0,0,10),var2=c(11,NA,NA,0,NA,16,0,NA,19,NA))
   df1= data.frame(cat = c(1,1,1,1,1,2,2,2,2,2),df)


   zero_rate_df =  df1 %>% group_by(cat) %>% do( zero_rate(.))

这里zero_rate(df)就像我预期的那样工作。但是当我按cat对数据进行分组并在每个类别中计算每列的zero_rate时,结果并不像我预期的那样。 我期待这样的事情:

   cat         va1  var2
    1   n_zero  1   1
            n   5   5
        z_rate  0.2 0.2
    2   n_zero  2   1
            n   5   5
       z_rate   0.4 0.2

有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我想出了以下代码。 .[-1]用于删除分组col:

zero_rate <- function(df){
    res <- lapply(df, function(x){
        y <- c(sum(x == 0, na.rm = T), length(x))
        c(y, y[1]/y[2])
    })
    res <- do.call(cbind.data.frame, res)
    res$vars <- c('n_zero', 'n', 'z_rate')
    res
}

df1 %>% group_by(cat) %>% do( zero_rate(.[-1]))

#     cat  var1  var2   vars
#   <dbl> <dbl> <dbl>  <chr>
# 1     1   1.0   1.0 n_zero
# 2     1   5.0   5.0      n
# 3     1   0.2   0.2 z_rate
# 4     2   2.0   1.0 n_zero
# 5     2   5.0   5.0      n
# 6     2   0.4   0.2 z_rate