获取字符值而不是因子级别

时间:2015-11-09 13:20:07

标签: r factors 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

这就是我得到的:

> 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"])

有效,但在现实生活中,我的变量可以是数字,所以我不想强迫它变成字符...

在我对因素的理解中缺少某些东西!

感谢。

1 个答案:

答案 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"

在这种情况下,你的循环会将数字变量视为数字变量,将字符变量视为字符而没有任何问题。