在 R 中获取数据框特定元素的值

Getting Values of Specific Elements of a data frame in R

我有一个非常简单的代码,我不明白为什么不能按我想要的方式工作。基本上,我有一个数据框,想要捕获数据框中一列的第 n 个元素的值,并将其存储在一个向量中。这是我的代码:

COL1_VALUES <- c("ABC","XYZ","PQR")
COL2_VALUES <- c("DEF","JKL","TSM")

means <- data.frame(COL1_VALUES,COL2_VALUES)

for (i in 1:nrow(means)) {
    COL1_VALUES[i] <- means$COL1[i];
    COL2_VALUES[i] <- means$COL2[i];
}

print(means$COL1)
print(COL1_VALUES)

这输出:

[1] ABC XYZ PQR
Levels: ABC PQR XYZ
[1] "1" "3" "2"

为什么我没有在向量 COL1_VALUES 中得到 ABC XYZ TSM?看起来 1、3、2 是 ABC XYZ TSM 在 means$COL1 中的索引。我需要什么才能在向量 COL1_VALUES 中获取 ABC XYZ TSM?

谢谢。

在 R 中,data.frame() 函数带有默认设置 stringsAsFactors=TRUE。这意味着在创建 data.frame 时,所有输入字符向量都被隐式转换为所谓的 "factors"。

factor 有点像带有整数的向量 + 描述这些整数的文本标签。例如,如果列 gender 的类型为 factor,它实际上是一个包含 12 的整数向量以及类别 ID 1 的附加字典] 表示 Male,类别 ID 2 表示 Female,反之亦然。

stringsAsFactors 上的这个默认设置是一只偷偷摸摸的野兽,可以出现在许多意想不到的地方。在大多数情况下,只需添加一个明确的 stringsAsFactors=FALSE 选项,以便将字符向量保持为字符向量。

下面我列出了我个人努力使用的功能,直到意识到我所缺少的只是 stringsAsFactors=FALSE 选项:

  • data.frame
  • read.csvread.table 和其他 read.* 函数
  • expand.grid

在上面的具体示例中,您需要做的是找到这一行:

means <- data.frame(COL1_VALUES,COL2_VALUES)

并将其替换为:

means <- data.frame(COL1_VALUES,COL2_VALUES,
                     stringsAsFactors=FALSE)

这样您就明确要求 data.frame() 不要在背后进行任何隐式转换。

您还可以通过在每个 R 会话开始时更改全局选项来避免这种转换:

options(stringsAsFactors = FALSE)

但是请注意,修改此全局选项只会影响您的机器,您的代码片段可能会停止在其他人的机器上运行。

answer 包含有关如何永久禁用它的更多信息。