我有一个非常简单的代码,我不明白为什么不以我想要的方式工作。基本上,我有一个数据框,想要捕获数据框中列的第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,3是ABC XYZ TSM的指数,意思是$ COL1。在向量COL1_VALUES中获取ABC XYZ TSM需要什么?
感谢。
答案 0 :(得分:1)
在R中,data.frame()
功能的默认设置为stringsAsFactors=TRUE
。这意味着所有输入字符向量都被隐式转换为所谓的&#34;因子&#34;在创建data.frame时。
factor 有点像带有整数的向量+描述这些整数的文本标签。例如,如果列gender
的类型为factor
,则它实际上是一个带有1
和2
s的整数向量以及一个类别为{{1}的附加字典}表示1
,类别ID Male
表示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)
不要在背后进行任何隐式转换。
您还可以通过在每个R会话开始时更改全局选项来避免此转换:
data.frame()
但是,请注意,修改此全局选项只会影响您的计算机,代码的代码段可能会停止在其他计算机上运行。
此answer包含有关如何永久禁用它的更多信息。