在 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
,它实际上是一个包含 1
和 2
的整数向量以及类别 ID 1
的附加字典] 表示 Male
,类别 ID 2
表示 Female
,反之亦然。
stringsAsFactors
上的这个默认设置是一只偷偷摸摸的野兽,可以出现在许多意想不到的地方。在大多数情况下,只需添加一个明确的 stringsAsFactors=FALSE
选项,以便将字符向量保持为字符向量。
下面我列出了我个人努力使用的功能,直到意识到我所缺少的只是 stringsAsFactors=FALSE
选项:
data.frame
read.csv
、read.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 包含有关如何永久禁用它的更多信息。
我有一个非常简单的代码,我不明白为什么不能按我想要的方式工作。基本上,我有一个数据框,想要捕获数据框中一列的第 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
,它实际上是一个包含 1
和 2
的整数向量以及类别 ID 1
的附加字典] 表示 Male
,类别 ID 2
表示 Female
,反之亦然。
stringsAsFactors
上的这个默认设置是一只偷偷摸摸的野兽,可以出现在许多意想不到的地方。在大多数情况下,只需添加一个明确的 stringsAsFactors=FALSE
选项,以便将字符向量保持为字符向量。
下面我列出了我个人努力使用的功能,直到意识到我所缺少的只是 stringsAsFactors=FALSE
选项:
data.frame
read.csv
、read.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 包含有关如何永久禁用它的更多信息。