强制摘要()报告NA的数量,即使没有

时间:2015-08-14 13:56:24

标签: r na summary

我有很多数字向量,有些有NA,有些没有。以下是两个向量的示例:

x1 <- c(1,2,3,2,2,4)
summary(x1)
 Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
1.000   2.000   2.000   2.333   2.750   4.000 

x2 <- c(1,2,3,2,2,4,NA)
summary(x2)
 Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
1.000   2.000   2.000   2.333   2.750   4.000       1 

最后,我想要rbind所有summary

rbind(summary(x1), summary(x2))
     Min. 1st Qu. Median  Mean 3rd Qu. Max. NA's
[1,]    1       2      2 2.333    2.75    4    1
[2,]    1       2      2 2.333    2.75    4    1
Warning message:
In rbind(summary(x1), summary(x2)) :
  number of columns of result is not a multiple of vector length (arg 1)

有没有办法强制summary无误地计算NA,也没有警告?

我所有的试验都失败了:

summary(x1, na.rm=FALSE)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   2.000   2.333   2.750   4.000 
summary(x1, useNA="always")
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   2.000   2.333   2.750   4.000 
summary(addNA(x1))
   1    2    3    4 <NA> 
   1    3    1    1    0 

我也试过以下内容,但这有点像黑客:

tmp <- rbind(summary(x1[complete.cases(x1)]), summary(x2[complete.cases(x2)]))
tmp <- cbind(tmp, c(sum(is.na(x1)), sum(is.na(x2))))
colnames(tmp)[ncol(tmp)] <- "NA's"
tmp
     Min. 1st Qu. Median  Mean 3rd Qu. Max. NA's
[1,]    1       2      2 2.333    2.75    4    0
[2,]    1       2      2 2.333    2.75    4    1

3 个答案:

答案 0 :(得分:2)

我还没有找到强制摘要显示NA的方法。但是,您可以编写一个返回所需内容的自定义函数:

my_summary <- function(v){
  if(!any(is.na(v))){
    res <- c(summary(v),"NA's"=0)
  } else{
    res <- summary(v)
  }
  return(res)
}

答案 1 :(得分:0)

因为问题在于您要组合不同长度的矢量,您可以将最长的长度分配给最短。组合它们时,这将生成缺少数据的NA,我们可以使用零替换它们。

s1 <- summary(x1)
s2 <- summary(x2)
length(s1) <- length(s2)
s <- rbind(s2,s1)
s[is.na(s)] <- 0

输出:

   Min. 1st Qu. Median  Mean 3rd Qu. Max. NA's
s2    1       2      2 2.333    2.75    4    1
s1    1       2      2 2.333    2.75    4    0

答案 2 :(得分:0)

之前给出的解决方案忽略了summary()也适用于data.frames和matrices的事实。我通常会通过递归函数定义来处理这个问题,尽管结果与原始的summary()函数的结果并不完全相同。

summaryna <- function(x, ...) {
  # Recursive function definition in case of matrix or data.frame.
  if(is.matrix(x)) {
    return(apply(x,2,function(x)summaryna(x, ...)))
  } else if (is.data.frame(x)) {
    return(sapply(x,function(x)summaryna(x, ...)))
  }
  # This is the actual function.
  sum <- summary(x, ...)
  if(length(sum)<7)    sum <- c(sum,"NA's"=0)
  return(sum)
}