我正在学习R,想知道填充空列表和填充空数据框的区别。我需要的数据集有3个变量,每个变量有51个观测值。
使用空列表:
zscoremds <- list()
for(col in names(mds_numbers)) {
zscoremds[[col]] = zscore(mds_numbers[[col]])
}
- mds_numbers* 是具有命名列的51 x3 Dataframe ;zscore 是计算列中每个元素的z得分的函数。
使用空数据框:
zscoremds <- data.frame()
for (j in 1:3) {
newcol <- zscore(mds_numbers[[j]])
zscoremds <- cbind(zscoremds, newcol)
}
这不起作用。我得到一个错误“不同的行数:0.51英寸
但是,当我预先分配 Dataframe 以具有51行时,它工作:
zscoremds <- data.frame(matrix(nrow = 51, ncol = 0))
for (j in 1:3) {
newcol <- zscore(mds_numbers[[j]])
zscoremds <- cbind(zscoremds, newcol)
}
为什么它可以在一个空列表上工作,但如果我向它添加新列,它就不能在一个空数据框上工作?
1条答案
按热度按时间mqkwyuun1#
列表可以包含不同长度的元素:
然而,如果你想按列绑定 Dataframe ,两个 Dataframe 需要有相同的行数。当你用
data.frame()
创建一个 Dataframe 时也是如此(见答案末尾的例外):一个 Dataframe 是一个长度相同的元素列表,其中包含一些附加属性(行名称、列名称等)。因此,一种绕过错误的方法是创建一个列表,然后将其转换为 Dataframe 。
但是在将这些元素转换成 Dataframe 之前,你需要再次确认它们的长度是相同的,看起来你已经发现了其中的一些行为,所以我不确定这是否能回答问题。
关于
data.frame()
函数,请注意,当一个输入的长度为1时,会有一个特殊的行为。该输入将在所有行中被 recycled(= repeated):