【发布时间】:2018-04-24 05:02:31
【问题描述】:
如何使用 sqldf 在左连接中保留因式变量?
我正在尝试使用 R 中的 sqldf 函数执行左连接;但是,该过程似乎将我的“正确”数据框中的因子列转换为合并数据集中的字符类。
我怀疑这是因为左连接包含来自“左”数据帧的行,而“右”数据帧中没有相应的行,因此将 NA 引入了因子列。
我创建了这个可重现的示例:
require(sqldf)
leftDF <- data.frame(A = sample(1:15, replace = FALSE),
B = sample(letters, 15, replace = TRUE),
stringsAsFactors = FALSE)
str(leftDF)
rightDF <- data.frame(X = sample(1:5, 10, replace = TRUE),
Y = sample(letters, 10, replace = TRUE),
stringsAsFactors = TRUE)
str(rightDF)
mergedDF <- sqldf("SELECT l.A, l.B, r.Y
FROM leftDF as l
LEFT JOIN rightDF as r
ON l.A = r.X")
str(mergedDF)
这是 sqldf 的预期行为吗?将因式变量转换为字符类对程序员来说可能并不明显,除非该变量的行为与他们在未来分析中的预期不同。
我可以通过在使用 addNA() 连接之前首先向分解列添加一个 NA 级别来保留该因子;但是,似乎不鼓励将 NA 添加为级别(请参阅 ?addNA 中的警告)。有没有更好的处理方法?
提前致谢,
杰夫
解决 cmets 的另一个示例:
require(sqldf)
leftDF <- data.frame(A = sample(1:15, replace = FALSE),
B = sample(letters, 15, replace = TRUE),
stringsAsFactors = FALSE)
str(leftDF)
rightDF <- data.frame(X = sample(1:5, 10, replace = TRUE),
Y = sample(c("one","two","three","four","five","six"),
10, replace = TRUE), stringsAsFactors = FALSE)
rightDF$Y <- factor(rightDF$Y, levels = c("one","two","three","four","five","six"))
#rightDF$Y <- addNA(rightDF$Y)
table(rightDF$Y)
str(rightDF)
mergedDF <- sqldf("SELECT l.A, l.B, r.Y as Y__factor
FROM leftDF as l
LEFT JOIN rightDF as r
ON l.A = r.X")
str(mergedDF)
table(mergedDF$Y, useNA = c("always"))
【问题讨论】:
-
基于对文档的快速阅读,我同意这似乎与那里的描述相反。不过,我对 sqldf 不是很有经验。我发现的另一个解决方法是使用
method = c('numeric','factor','factor')。