【问题标题】:R nested functionsR 嵌套函数
【发布时间】:2022-12-14 11:16:27
【问题描述】:

我必须计算数据集中每个观察值的缺失值数量。由于跨多个时间段有几个变量,我认为最好尝试一个函数来保持我的语法干净。查找缺失值数量的第一部分工作正常:

data$NMISS <- data %>% 
  select('x1':'x4') %>%  
  apply(1, function(x) sum(is.na(x)))

但是,当我尝试将其转换为函数时,我得到“select() 错误:!NA/NaN 参数”

library(dplyr)
library(tidyverse)

data <- data.frame(x1 = c(NA, 1, 5, 1),   
                   x2 = c(7, 1, 1, 5),
                   x3 = c(9, NA, 4, 9),
                   x4 = c(3, 4, 1, 2))

NMISSfunc <- function (dataFrame,variables) {
  
  dataFrame %>% select(variables) %>% 
    apply(1, function(x) sum(is.na(x)))
  
}

data$NMISS2 <- NMISSfunc(data,'x1':'x4')

我认为它不喜欢范围内的:,因为它将接受c('x1','x2','x3','x4')而不是'x1':'x4'

有些范围超过二十列,因此列出它们并不能真正提供保持语法整洁的解决方案。

有什么建议么?

【问题讨论】:

    标签: r nested-function


    【解决方案1】:

    你是对的,你不能使用"x4":"x4",因为这不是有效的 R 语法。为了让它以 tidyverse 风格工作,你的 variables 变量需要在 select 中有选择地取消引用。幸运的是,tidyverse 有卷曲的符号 {{variables}} 来处理这种情况:

    NMISSfunc <- function (dataFrame, variables) {
      
      dataFrame %>% 
        select({{variables}}) %>% 
        apply(1, function(x) sum(is.na(x)))
    }
    

    现在我们可以使用x1:x4(不带引号)并且该函数按预期工作:

    NMISSfunc(data, x1:x4)
    #> [1] 1 1 0 0
    

    创建于 2022-12-13 reprex v2.0.2

    【讨论】:

      【解决方案2】:

      为什么不简单地,

      data %>% 
       mutate(NMISS = as.integer(is.na(rowSums(select(., x1:x4)))))
      
        x1 x2 x3 x4 NMISS
      1 NA  7  9  3     1
      2  1  1 NA  4     1
      3  5  1  4  1     0
      4  1  5  9  2     0
      

      【讨论】: