我被一个显然非常简单的因子字符变量的问题所困扰。
test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557"))
test
uv=c()
for (i in 1:length(test$uv)){
uv[i]=test[i,"uv"]
}
uv这就是我得到的:
> test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557"))
> test
uv
1 03834
2 06044
3 06054
4 03834
5 48557
6 48207
7 03834
8 06044
9 48557
> uv=c()
> for (i in 1:length(test$uv)){
+ uv[i]=test[i,"uv"]
+ }
> uv
[1] 1 2 3 1 5 4 1 2 5
> 我的问题是,为什么它要保留级别编号而不是字符值?
我知道如果我说:
uv[i]=as.character(test[i,"uv"])这是可行的,但在“现实生活”中,我的变量可以是数字的,所以我不想强迫它变成字符……
在我对因素的理解中似乎缺少了一些东西!
谢谢。
发布于 2015-11-09 22:17:08
如果你这样对待你的factor变量(for循环迭代每个元素),那么它存储的信息就是值的位置,值本身存储在“级别”中。你可以把它看作是一个基于位置的查找表。
如果您这样做:
test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557"))
test
uv= c()
for (i in 1:length(test$uv)){
uv[i]=test[i,"uv"]
}
uv
# [1] 1 2 3 1 5 4 1 2 5
factor(uv, labels = levels(test$uv))
# [1] 03834 06044 06054 03834 48557 48207 03834 06044 48557
# Levels: 03834 06044 06054 48207 48557您将看到,您可以使用原始数据集中的位置和级别来获取实际值。发生这种情况的原因是为了使您能够处理整数,这比处理字符值更快。要做到这一点而不丢失任何信息,唯一的方法是通过实际字符值和整数之间的一对一关系。
如果您这样做了:
uv2 = test[,"uv"]
uv2
# [1] 03834 06044 06054 03834 48557 48207 03834 06044 48557
# Levels: 03834 06044 06054 48207 48557您将看到uv2包含了所有信息,因为您没有遍历每个元素,但您将因子列作为一个整体使用。
不确定你所说的“现实生活中的数值变量”是什么意思。在这种情况下,您不会有任何问题,因为数值变量不是因子变量或字符变量。
test = data.frame(uv=c(03834,06044,06054,03834))
test
uv= c()
for (i in 1:length(test$uv)){
uv[i]=test[i,"uv"]
}
uv
# [1] 3834 6044 6054 3834但是你会遗漏数字开头的任何零。
如果您更喜欢使用数字或字符变量,则可以使用选项stringsAsFactors = F,它将确保您不会有任何因子变量。
test = data.frame(uv=c("03834","06044","06054","03834","48557","48207","03834","06044","48557"),
stringsAsFactors = F)
test
uv= c()
for (i in 1:length(test$uv)){
uv[i]=test[i,"uv"]
}
uv
# [1] "03834" "06044" "06054" "03834" "48557" "48207" "03834" "06044" "48557"在这种情况下,您的循环会毫不费力地将数值变量视为数值变量,将字符变量视为字符变量。
https://stackoverflow.com/questions/33610038
复制相似问题