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
设置。
答案 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