首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据框和使用字符列时的常见错误

数据框和使用字符列时的常见错误
EN

Stack Overflow用户
提问于 2012-10-20 05:46:26
回答 2查看 182关注 0票数 1

R中有用的data.frame的一个非常意想不到的行为是将character列作为因子。如果不考虑这一点,这会导致许多问题。例如,假设以下代码:

代码语言:javascript
运行
复制
foo=data.frame(name=c("c","a"),value=1:2)
#   name val
# 1    c   1
# 2    a   2

bar=matrix(1:6,nrow=3)
rownames(bar)=c("a","b","c")
#   [,1] [,2]
# a    1    4
# b    2    5
# c    3    6

那么你对运行bar[foo$name,]有什么期望呢?它通常应该返回根据表示行'c‘和'a’的foo$name命名的bar行。但结果是不同的:

代码语言:javascript
运行
复制
bar[foo$name,]
#   [,1] [,2]
# b    2    5
# a    1    4

原因是:foo$name不是字符向量,而是整数向量。

代码语言:javascript
运行
复制
foo$name
# [1] c a
# Levels: a c

为了获得预期的行为,我手动将其转换为字符向量:

代码语言:javascript
运行
复制
foo$name = as.character(foo$name)
bar[foo$name,]
#   [,1] [,2]
# c    3    6
# a    1    4

但问题是,我们可能很容易错过执行这一点,并在我们的代码中隐藏错误。有没有更好的解决方案?

EN

Stack Overflow用户

发布于 2012-10-20 12:25:29

在下面的示例数据中,作者和标题会自动转换为因子(除非您在创建数据时添加了参数stringsAsFactors = FALSE )。如果我们忘记更改默认设置,并且不想全局设置选项,该怎么办?

我在某处发现的一些代码(很可能是这样)使用sapply()来标识因子并将其转换为字符串。

代码语言:javascript
运行
复制
dat = data.frame(title = c("title1", "title2", "title3"),
                 author = c("author1", "author2", "author3"),
                 customerID = c(1, 2, 1))
# > str(dat)
# 'data.frame': 3 obs. of  3 variables:
#   $ title     : Factor w/ 3 levels "title1","title2",..: 1 2 3
#   $ author    : Factor w/ 3 levels "author1","author2",..: 1 2 3
#   $ customerID: num  1 2 1

dat[sapply(dat, is.factor)] = lapply(dat[sapply(dat, is.factor)], 
                                 as.character)
# > str(dat)
# 'data.frame':  3 obs. of  3 variables:
#   $ title     : chr  "title1" "title2" "title3"
#   $ author    : chr  "author1" "author2" "author3"
#   $ customerID: num  1 2 1

我假设这将比使用stringsAsFactors = FALSE参数重新读取数据集更快,但从未进行过测试。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12982896

复制
相关文章

相似问题

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