R: функция mapply возвращает ошибку: уровни факторов различаются

У меня есть два фрейма данных (DfA и DfB). Каждый фрейм данных имеет три факторных переменных: вид, тип и регион. DfA также имеет столбец числовых значений, и я хочу использовать его для оценки числовых значений в новом столбце DfB на основе общих атрибутов.

У меня есть функция, которая запрашивает вид, тип и регион, затем создает подмножество DfA с этими атрибутами и запускает алгоритм на подмножестве для оценки нового значения. Когда я запускаю функцию и указываю значения вручную в качестве теста, она работает нормально.

Если все уровни факторов и комбинации в DfB имеют соответствующие коэффициенты в DfA, функция отлично работает с mapply. Но если какая-либо строка в DfB содержит уровень фактора, которого нет в DfA, я получаю сообщение об ошибке (наборы уровней факторов различаются). Пример: если DfA включает данные для регионов A, B и C, а DfB содержит данные для регионов A, B, C и D, mapply возвращает ошибку; если я удалю строки с областью D, функция сопоставления сработает.

Как я могу указать это, если строка содержит факторный уровень, который делает функцию невозможной, пропустить его или вместо этого ввести NA и перейти к запуску функции в строках, для которых функция работает?


person user3475259    schedule 29.03.2014    source источник
comment
Можете ли вы опубликовать репрезентативную выборку ваших двух фреймов данных и пример кода для вашей функции?   -  person Gary Weissman    schedule 29.03.2014


Ответы (1)


Вы можете добавлять уровни в свой data.frames, чтобы убедиться, что ваша функция работает, а не для особых случаев:

# dropping and setting levels
Z = as.factor(sample(LETTERS[1:5],20,replace=T))
levels(Z)
Y = as.factor(Z[-which(Z %in% LETTERS[4:5])])
levels(Y)
Y=droplevels(Y) # drop the levels
levels(Y)
levels(Y) = levels(Z) # bring them back
levels(Y)
Y = factor(Y,levels=LETTERS[1:7]) # expand them
levels(Y)
attr(Y,"levels")
attr(Y,"levels") = LETTERS[1:8] # keep expanding them
levels(Y)
require(plyr)
Y = mapvalues(Y,levels(Y),letters[1:length(levels(Y))]) # change the labels of the levels
levels(Y)
x<-factor(Y, labels=LETTERS[(length(unique(Y))+1):(2*length(unique(Y)))]) # change the labels of the levels on another variable

В твоем случае:

dfa = data.frame("LVL1"=as.factor(sample(LETTERS[1:2],20,replace=T)))
dfb = data.frame("LVL2"=as.factor(sample(LETTERS[2:5],20,replace=T)))
newLevels = sort(unique(union(levels(dfa$LVL1),levels(dfb$LVL2))))
dfa$LVL1 = factor(dfa$LVL1,levels=newLevels)
dfb$LVL2 = factor(dfb$LVL2,levels=newLevels)
person Hans Roggeman    schedule 29.03.2014