cbind() 在不同长度的矩阵上

cbind() on matrices with different lengths

我正在编写一个 for 循环,将一组向量的 summary() 的输出转换为类似 foo 的矩阵,如下:

            introA   introB  introC  helpA    helpB   helpC
Min.        1        1        4       4       2       4
1st Qu.     5        5        5       5       4       5
Median      5        5        5       5       4       5
Mean        4.83     4.71     4.96    4.89    4.02    4.77
3rd Qu.     5        5        5       5       5       5
Max.        5        5        5       5       5       5
NA's        2        5        0       3       0       2

请注意 introChelpBNA 行中有零,并且 summary() 默认情况下不会产生这个 - 如果您调用 summary() 在没有 NA 值的向量上,结果是一个长度为 6 而不是 7 的对象。

我的for循环初始化一个空矩阵x,将数据帧中每个数值向量的summary的结果分配给x,并绑定每个x 到更大的对象 y。这适用于所有数据帧,其中每个向量都没有缺失值或所有向量都没有。

当一些向量有缺失值而另一些没有时,我写了这个解决方法:

x <- matrix(NA,nrow=7,ncol=1)
y <- NULL

for(i in 1:ncol(foo)){

  if(length(summary(foo[,i]==6))){

    x <- as.matrix(c(summary(foo[,i]), 0))
    rownames(x) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's")

  }else if(length(summary(foo[,i]==7))){

    x <- as.matrix(summary(foo[,i]))
    rownames(x) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's")

  }

  y <- cbind(y,x)
  x <- matrix(NA,nrow=7,ncol=1)
}

这里我检查一个向量的 summary() 是长度是 6 还是 7,如果不是,我会添加一行,然后将结果绑定在一起。在我的循环之外,这有效。出于某种原因,当我尝试在循环中 运行 this 时出现以下错误:

Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

知道我的长度如何不等于数组范围吗?我已经检查了 foo 中所有向量的 summary() 的长度;都是 6 或 7 的长度。

首先,我们将 iris 数据集的列作为环境中的向量,我们将一些 NA 放入其中之一:

list2env(iris[1:4],envir = globalenv())
Sepal.Length[1:3] <- NA

然后:

sapply(list(Sepal.Length = Sepal.Length,Sepal.Width = Sepal.Width,Petal.Length = Petal.Length,Petal.Width = Petal.Width),
       function(x) { x <- summary(x); if (is.na(x["NA's"])) x["NA's"] <- 0;x})

#         Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min.        4.300000    2.000000        1.000    0.100000
# 1st Qu.     5.100000    2.800000        1.600    0.300000
# Median      5.800000    3.000000        4.350    1.300000
# Mean        5.862585    3.057333        3.758    1.199333
# 3rd Qu.     6.400000    3.300000        5.100    1.800000
# Max.        7.900000    4.400000        6.900    2.500000
# NA's        3.000000    0.000000        0.000    0.000000

答案:因为我的 length() 调用写错了,我想指定的条件从来都不是真的。我将它们更正为以下...

if(length(summary(tueAn[,i]))==6)

if(length(summary(tueAn[,i]))==7)

然后一切就位。哎呀