【问题标题】:Sub-function in grouping function using dplyr使用 dplyr 分组函数中的子函数
【发布时间】:2016-03-16 00:46:45
【问题描述】:

我正在使用 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)}

最理想的情况是,我现在可以编写 missing(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
...

所以发生的情况是“缺失”列仅显示 task_1 的 NA 案例总数,而忽略了组;并且用 NAobs(variable name) 替换 NAobs(x) 来解决这个问题会破坏首先编写函数的目的。如何计算每组的缺失案例数,而不必每次都复制代码和更改变量名称?谢谢!

【问题讨论】:

  • 您是否假设函数参数 x 在您的函数内部的 NAobs 范围内被评估?大概您想将其作为文本传递,然后...我不完全确定。
  • 您可以将NAobs 简化为NAobs &lt;- function(x) sum(is.na(x))
  • 您需要阅读非标准评估。 Hadley has written some useful things about it. 本质上,x 将被引用,因此您需要使用 SE summarise_ 版本,为此您需要对输入进行不同的格式化。

标签: r function dplyr missing-data counting


【解决方案1】:

新的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多