在 R 中使用 summarySE 函数时,如何抑制只有一个观察值的分组的 NaN 值的警告消息?

How to suppress the warning message for NaN values for groupings with only one observation when using the summarySE function in R?

我正在创建一个使用 summarySE 函数的仪表板。到目前为止这是按预期工作的,但我注意到控制台 window 在 table 上使用此函数时使用的分组产生错误消息,该分组至少包含一个组,其中只有一个观察. (这会导致 SD、SE 和 CI 失败。)

有没有办法抑制由该实例引起的错误消息?这不是我关心的事情,因为我希望有一些像这样的小分组,但我不希望产生错误消息,除非我需要实际调查某些事情。

举个例子...

summarySE(head(iris),measurevar='Sepal.Width', groupvars=('Petal.Length'))

只有一组 (Petal.Length = 1.4) 有不止一个观察值。 NA 是根据其他组的相关统计数据生成的,只有一个观察值。上述函数给出以下输出:

  Petal.Length N Sepal.Width       sd        se        ci
1          1.3 1    3.200000       NA        NA        NA
2          1.4 3    3.366667 0.321455 0.1855921 0.7985386
3          1.5 1    3.100000       NA        NA        NA
4          1.7 1    3.900000       NA        NA        NA
Warning message:
In qt(conf.interval/2 + 0.5, datac$N - 1) : NaNs produced

我知道有一个 na.rm 参数,您可以将其设置为 TRUE/FALSE 以忽略 NA 值,但在这种情况下这似乎没有做任何我能注意到的事情。

有谁知道如何抑制这个错误?

如警告消息中所述,这是由于 qt() 函数在自由度为 1 时给出 NaN。您可以在 qt() 上使用 suppressWarnings()自己的函数副本summarySE,如下所示。

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
  library(plyr)
  
  # New version of length which can handle NA's: if na.rm==T, don't count them
  length2 <- function (x, na.rm=FALSE) {
    if (na.rm) sum(!is.na(x))
    else       length(x)
  }
  
  # This does the summary. For each group's data frame, return a vector with
  # N, mean, and sd
  datac <- ddply(data, groupvars, .drop=.drop,
                 .fun = function(xx, col) {
                   c(N    = length2(xx[[col]], na.rm=na.rm),
                     mean = mean   (xx[[col]], na.rm=na.rm),
                     sd   = sd     (xx[[col]], na.rm=na.rm)
                   )
                 },
                 measurevar
  )
  
  # Rename the "mean" column    
  #datac <- plyr::rename(datac, c("mean" = measurevar))
  names(datac)[names(datac) == 'mean'] <- measurevar
  
  datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
  
  # Confidence interval multiplier for standard error
  # Calculate t-statistic for confidence interval: 
  # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
  ciMult <- suppressWarnings(qt(conf.interval/2 + .5, datac$N-1))
  datac$ci <- datac$se * ciMult
  
  return(datac)
}

summarySE(head(iris),measurevar='Sepal.Width', groupvars='Petal.Length', na.rm=TRUE, .drop=TRUE)