R语言 填充空列表与填充空数据框

ocebsuys  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(170)

我正在学习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)
}

为什么它可以在一个空列表上工作,但如果我向它添加新列,它就不能在一个空数据框上工作?

mqkwyuun

mqkwyuun1#

列表可以包含不同长度的元素:

test_list <- list(
  a = 1:10,
  b = "hello there",
  c = list(1)
)
test_list
#> $a
#>  [1]  1  2  3  4  5  6  7  8  9 10
#> 
#> $b
#> [1] "hello there"
#> 
#> $c
#> $c[[1]]
#> [1] 1

然而,如果你想按列绑定 Dataframe ,两个 Dataframe 需要有相同的行数。当你用data.frame()创建一个 Dataframe 时也是如此(见答案末尾的例外):

data.frame(
  x = 1:2, # 2 rows
  y = 1:3 # 3 rows
)
#> Error in data.frame(x = 1:2, y = 1:3): les arguments impliquent des nombres de lignes différents : 2, 3

cbind(
  data.frame(), # 0 rows
  data.frame(y = 1) # 1 row
)
#> Error in data.frame(..., check.names = FALSE): les arguments impliquent des nombres de lignes différents : 0, 1

cbind(
  data.frame(x = 0), # 1 row
  data.frame(y = 1) # 1 row
)
#>   x y
#> 1 0 1

一个 Dataframe 是一个长度相同的元素列表,其中包含一些附加属性(行名称、列名称等)。因此,一种绕过错误的方法是创建一个列表,然后将其转换为 Dataframe 。

my_df <- list()
for (i in 1:5) {
  my_df[[paste0("x", i)]] <- rep(i, 3) * 2
}
as.data.frame(my_df)
#>   x1 x2 x3 x4 x5
#> 1  2  4  6  8 10
#> 2  2  4  6  8 10
#> 3  2  4  6  8 10

但是在将这些元素转换成 Dataframe 之前,你需要再次确认它们的长度是相同的,看起来你已经发现了其中的一些行为,所以我不确定这是否能回答问题。
关于data.frame()函数,请注意,当一个输入的长度为1时,会有一个特殊的行为。该输入将在所有行中被 recycled(= repeated):

data.frame(
  x = 1:2, # 2 rows
  y = 0 # 1 value but it gets repeated on all rows
)
#>   x y
#> 1 1 0
#> 2 2 0

相关问题