我陷入了一个非常简单的因子字符变量问题。
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"])
有效,但在现实生活中,我的变量可以是数字,所以我不想强迫它变成字符...
在我对因素的理解中缺少某些东西!
感谢。
答案 0 :(得分:3)
如果你像这样处理你的因子变量(对于每个元素的循环迭代),那么它存储的信息是值的位置,值本身存储在" levels"中。您可以将其视为基于位置的查找表。
如果你这样做:
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"
在这种情况下,你的循环会将数字变量视为数字变量,将字符变量视为字符而没有任何问题。