强制 summary() 报告 NA 的数量,即使 none
force summary() to report the number of NA's even if none
我有很多数值向量,有些有 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
我还没有找到强制摘要显示 NA 的方法。但是,您可以编写一个 returns 您想要的自定义函数:
my_summary <- function(v){
if(!any(is.na(v))){
res <- c(summary(v),"NA's"=0)
} else{
res <- summary(v)
}
return(res)
}
因为问题是您要组合不同长度的向量,所以您可以将最长的长度分配给最短的。当您组合它们时,这将为丢失的数据生成 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
之前给出的解决方案忽略了 summary() 也适用于 data.frames 和矩阵的事实。我通常会通过递归函数定义来处理这个问题,尽管结果与原始 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)
}
我有很多数值向量,有些有 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
我还没有找到强制摘要显示 NA 的方法。但是,您可以编写一个 returns 您想要的自定义函数:
my_summary <- function(v){
if(!any(is.na(v))){
res <- c(summary(v),"NA's"=0)
} else{
res <- summary(v)
}
return(res)
}
因为问题是您要组合不同长度的向量,所以您可以将最长的长度分配给最短的。当您组合它们时,这将为丢失的数据生成 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
之前给出的解决方案忽略了 summary() 也适用于 data.frames 和矩阵的事实。我通常会通过递归函数定义来处理这个问题,尽管结果与原始 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)
}