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
请注意 introC
和 helpB
在 NA
行中有零,并且 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)
然后一切就位。哎呀
我正在编写一个 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
请注意 introC
和 helpB
在 NA
行中有零,并且 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)
然后一切就位。哎呀