首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取字符值而不是因子级别

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

Stack Overflow用户
提问于 2015-11-09 21:20:07
回答 1查看 5.5K关注 0票数 0

我被一个显然非常简单的因子字符变量的问题所困扰。

代码语言:javascript
复制
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

这就是我得到的:

代码语言:javascript
复制
> 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
> 

我的问题是,为什么它要保留级别编号而不是字符值?

我知道如果我说:

代码语言:javascript
复制
     uv[i]=as.character(test[i,"uv"])

这是可行的,但在“现实生活”中,我的变量可以是数字的,所以我不想强迫它变成字符……

在我对因素的理解中似乎缺少了一些东西!

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-11-09 22:17:08

如果你这样对待你的factor变量(for循环迭代每个元素),那么它存储的信息就是值的位置,值本身存储在“级别”中。你可以把它看作是一个基于位置的查找表。

如果您这样做:

代码语言:javascript
复制
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

您将看到,您可以使用原始数据集中的位置和级别来获取实际值。发生这种情况的原因是为了使您能够处理整数,这比处理字符值更快。要做到这一点而不丢失任何信息,唯一的方法是通过实际字符值和整数之间的一对一关系。

如果您这样做了:

代码语言:javascript
复制
uv2 = test[,"uv"]
uv2

# [1] 03834 06044 06054 03834 48557 48207 03834 06044 48557
# Levels: 03834 06044 06054 48207 48557

您将看到uv2包含了所有信息,因为您没有遍历每个元素,但您将因子列作为一个整体使用。

不确定你所说的“现实生活中的数值变量”是什么意思。在这种情况下,您不会有任何问题,因为数值变量不是因子变量或字符变量。

代码语言:javascript
复制
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,它将确保您不会有任何因子变量。

代码语言:javascript
复制
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"

在这种情况下,您的循环会毫不费力地将数值变量视为数值变量,将字符变量视为字符变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33610038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档