Как вы сохраняете факторизованные переменные в левом соединении с использованием sqldf?Сохранение столбца в качестве фактора при выполнении левого соединения с использованием sqldf в R
Я пытаюсь выполнить левое соединение, используя функцию sqldf в R; однако процесс, похоже, преобразует обработанный столбцом в моем «правильном» фрейме данных в класс символов в объединенном наборе данных.
Я подозреваю, что это связано с тем, что левое соединение включает строки из «левого» фрейма данных, для которых нет соответствующих строк в «правильном» кадре данных, таким образом вводя НС в факторизуемый столбец.
Я создал этот воспроизводимый пример:
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? Преобразование факторируемой переменной в класс символов может быть не очевидным для программистов, пока переменная не будет вести себя так, как они ожидают в будущих анализах.
Я могу сохранить этот фактор, предварительно добавив уровень NA к столбцу с факторизацией до объединения с помощью addNA(); однако, добавление NA как уровня, кажется, не рекомендуется (см. предупреждение в? addNA). Есть ли лучший способ справиться с этим?
Спасибо заранее,
Джефф
Дополнительный пример для рассмотрения комментариев:
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')'. – joran