如何停止合并将字符转换为因子?

时间:2016-06-22 23:52:07

标签: r

E.g。

chr <- c("a", "b", "c")
intgr <- c(1, 2, 3)
str(chr)
str(base::merge(chr,intgr, stringsAsFactors = FALSE))

给出:

> str(base::merge(chr,intgr, stringsAsFactors = FALSE))
'data.frame':   9 obs. of  2 variables:
 $ x: Factor w/ 3 levels "a","b","c": 1 2 3 1 2 3 1 2 3
 $ y: num  1 1 1 2 2 2 3 3 3

我原本以为它与合并如何将参数强制转换为数据框有关。但是,我认为添加参数stringsAsFactors = FALSE会覆盖char的默认强制行为 - &gt;因素,但这不起作用。

编辑:执行以下操作可为我提供预期的行为:

options(stringsAsFactors = FALSE)
str(base::merge(chr,intgr))

即:

> str(base::merge(chr,intgr))
'data.frame':   9 obs. of  2 variables:
 $ x: chr  "a" "b" "c" "a" ...
 $ y: num  1 1 1 2 2 2 3 3 3

但这并不理想,因为它会更改全局stringsAsFactors设置。

2 个答案:

答案 0 :(得分:2)

你可以完成这个特殊的&#34;合并&#34;使用expand.grid(),因为您真的只是采用笛卡尔积。这允许您传递stringsAsFactors参数:

sapply(expand.grid(x=chr,y=intgr,stringsAsFactors=F),class);
##           x           y
## "character"   "numeric"

这是一种解决merge()

限制的方法
sapply(merge(data.frame(x=chr,stringsAsFactors=F),intgr),class);
##           x           y
## "character"   "numeric"

我认为将原子向量传递给merge()是没有意义的,因为它只是为了合并data.frames而设计的。

答案 1 :(得分:1)

我们可以使用CJ中的data.table作为

library(data.table)
str(CJ(chr, intgr))
Classes ‘data.table’ and 'data.frame':  9 obs. of  2 variables:
#$ V1: chr  "a" "a" "a" "b" ...
#$ V2: num  1 2 3 1 2 3 1 2 3