使用dplyr分组函数的子函数

时间:2016-03-16 00:46:45

标签: r function dplyr missing-data counting

我使用dpylr软件包为每个变量计算子组的缺失值。

我使用了迷你功能:

NAobs <- function(x) length(x[is.na(x)]) ####function to count missing data for variables

计算缺失值。 因为我有一些变量而且我想添加更多信息(每组的样本大小和每组丢失数据的百分比),我编写了以下代码,并插入一个变量(task_1)来检查它。

library(dplyr)
group_by(DataRT, class) %>%
  summarise(class_size=length(class), missing = NAobs(task_1), perc.= missing/class_size)

这非常有效,我收到一张这样的表格:

   class class_size missing      perc.
   (dbl)      (int)   (int)      (dbl)
1      1         25       2 0.08000000
2      2         25       1 0.04000000
3      3         25       3 0.12000000
4      4         25       4 0.16000000
5      5         24       3 0.12500000
6      6         29       6 0.20689655
...

在下一步中,我希望通过将其包含在函数中来概括我的命令:

missing<-function(x, print=TRUE){
            group_by(DataRT, class) %>%
                    summarise(class_size=length(class), 
                        missing = NAobs(x),
                        perc.= missing/class_size)}

最理想的是,我现在可以编写缺失(task_1)并获得相同的表,但是NAobs(x)忽略了分组变量(类),我收到一个这样的表:

   class class_size missing    perc.
   (dbl)      (int)   (int)    (dbl)
1      1         25      59 2.360000
2      2         25      59 2.360000
3      3         25      59 2.360000
4      4         25      59 2.360000
5      5         24      59 2.458333
6      6         29      59 2.034483
...

所以会发生的事情是,该列&#34;缺少&#34;仅显示task_1的NA个案总数,忽略这些组;并用NAobs(变量名)替换NAobs(x)来解决这个问题会破坏编写函数的目的。如何在不必复制代码和每次更改变量名的情况下计算每组丢失案例的数量?谢谢!

1 个答案:

答案 0 :(得分:0)

新的dplyr更新。最新的dplyr将能够通过两个新函数enquo!!来解决这个问题。第一个引用像substitute那样的输入,第二个引用它进行评估。有关使用dplyr进行编程的更多信息,see this vignette

您需要developer's version of dplyr,我还建议the newest rlang install

#install developer's version until new release in May
library(dplyr) #0.5.0.9004+

#Setup
set.seed(143)
NAobs <- function(x) length(x[is.na(x)])
DataRT <- data.frame(class = sample(1:6, 25, TRUE), task1 = sample(c(NA,1), 25, TRUE),
                     task2 = sample(c(NA,1), 25, TRUE))
f <- function(x) {
  my_var <- enquo(x)
  group_by(DataRT, class) %>%
    summarise(class_size=length(class), 
    missing = NAobs(!!my_var),
    perc.= missing/class_size)
}
f(task1)
# # A tibble: 6 × 4
#   class class_size missing     perc.
#   <int>      <int>   <int>     <dbl>
# 1     1          5       0 0.0000000
# 2     2          4       2 0.5000000
# 3     3          3       0 0.0000000
# 4     4          1       0 0.0000000
# 5     5          5       3 0.6000000
# 6     6          7       3 0.4285714