为什么因子会被强制转换为数据框的子集?

Why do factors get coerced to a number subsetting a data frame?

我试图获取 iris 数据集的对角线并编写了以下 for 循环:

diagonal_list <- list()
  for (j in seq_len(ncol(iris))) {
    diagonal_list[j] <- iris[[j,j]]
  }
  diagonal_list

我的输出是:

[[1]]
[1] 5.1

[[2]]
[1] 3

[[3]]
[1] 1.3

[[4]]
[1] 0.2

[[5]]
[1] 1

但是我想要

[[1]]
[1] 5.1

[[2]]
[1] 3

[[3]]
[1] 1.3

[[4]]
[1] 0.2

[[5]]
[1] setosa
Levels: setosa versicolor virginica

这通常应该 return 一个对角线列表,而 iris 数据框的第 5 列包含物种。但是,在我的列表输出中,物种不是一个因素,而只是 1(一个数字)。我怎样才能确保我的列表包含该因素?

您必须在列表中添加 iris[[j,j]]

diagonal_list <- list()
  for (j in seq_len(ncol(iris))) {
    diagonal_list[j] <- list(iris[[j,j]])
  }

str(diagonal_list)

List of 5
 $ : num 5.1
 $ : num 3
 $ : num 1.3
 $ : num 0.2
 $ : Factor w/ 3 levels "setosa","versicolor",..: 1

for-loop中的赋值两边要用双括号[[

diagonal_list <- list()
for (j in seq_len(ncol(iris))) {
  diagonal_list[[j]] <- iris[[j,j]]
}

不循环提取对角线的另一种解决方案:

lapply(seq_along(iris), \(x) iris[x, x])

输出
[[1]]
[1] 5.1

[[2]]
[1] 3

[[3]]
[1] 1.3

[[4]]
[1] 0.2

[[5]]
[1] setosa
Levels: setosa versicolor virginica