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

标签 r group-by user-defined

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

   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] 用于删除分组 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

关于r - 在 R 中分组数据后使用用户定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43237462/

相关文章:

r - 在summary()中使用变量作为参数

MySQL 按复杂脚本分组

r - 在R回归中获得预测变量名称

r - 根据月份日期向数据表添加季节列

python - 数据帧中列中值序列的频率

c++ - 用户定义的中缀运算符

mysql - MySQL 的 INSERT 查询中的用户定义变量

java - 用户定义的方法编译器错误

r - Xaringan:数学在脚注类中呈现为内联代码

r - 仅从脚本中获取单个变量