为什么因子会被强制转换为数据框的子集?
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
我试图获取 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