按因子列安全地合并数据帧

krl*_*mlr 8 merge r

因素可以帮助防止R中出现某些类型的编程错误:您无法对使用不同级别的因素执行相等性检查,并且在执行大于/小于检查无序因子时会收到警告.

a <- factor(letters[1:3])
b <- factor(letters[1:3], levels=letters[4:1])
a == b
## Error in Ops.factor(a, b) : level sets of factors are different
a < a
## [1] NA NA NA
## Warning message:
## In Ops.factor(a, a) : < not meaningful for factors
Run Code Online (Sandbox Code Playgroud)

但是,与我的预期相反,合并数据帧时不执行此检查:

ad <- data.frame(x=a, a=as.numeric(a))
bd <- data.frame(x=b, b=as.numeric(b))
merge(ad, bd)
##   x a b
## 1 a 1 4
## 2 b 2 3
## 3 c 3 2
Run Code Online (Sandbox Code Playgroud)

这些因素似乎只是强迫人物.

某个可以进行检查的"安全合并"是否可用?您是否看到默认情况下不进行此检查的具体原因?

示例(现实使用案例):假设两个空间数据集具有非常相似但不完全相同的细分,例如,communes.数据集指的是稍微不同的时间点,并且一些公社在该时间跨度内合并.每个数据集都有一个"commune ID"列,甚至可能名称相同.虽然此列的语义非常相似,但我不希望(意外地)合并此commune ID列上的数据集.相反,我在"旧"和"新"公社ID之间构建匹配表.如果将通信ID编码为因子,则"安全合并"将给出合并操作的正确性检查,而无需额外(实现)成本和非常小的计算成本.

Car*_*oft 0

好吧,非常感谢(并向)MrFlick 表示歉意:

> attributes(ad$x)
$levels
[1] "a" "b" "c"

$class
[1] "factor"


> attributes(ad$a)
NULL

> attributes(ad$b)
NULL

> adfoo<-merge(ad,bd)

> attributes(adfoo$x)
$levels
[1] "a" "b" "c"

$class
[1] "factor"
Run Code Online (Sandbox Code Playgroud)

因此,实际上合并的列$x是一个因素,尽管只有两个ad和共同的级别bd被合并。其他列很久以前就通过 as.numeric 进行了强制。