提问者:小点点

r: mApplication函数返回错误:因子的级别集不同


我有两个数据帧(DfA和DfB)。每个数据框有三个因素变量:物种、类型和区域。DfA还有一个数值列,我想使用它根据共享属性估计DfB新列中的数值。

我有一个函数,它要求物种、类型和区域,然后用这些属性创建一个DfA子集,并在子集上运行一个算法来估计新值。当我运行函数并手动指定值作为测试时,它工作正常。

如果DfB中的所有因子级别和组合在DfA中都有匹配的因子,则该函数可以很好地使用mApplication。但是,如果DfB中的任何行包含DfA中不存在的因子级别,则会出现错误(因子级别集不同)。例如:如果DfA包含区域A、B和C的数据,而DfB包含区域A、B、C和D的数据,mApplication将返回错误;如果我删除区域D的行,mApplication函数将工作。

如果行包含使函数无法执行的因子级别,我如何指定跳过它或将NA放入,然后继续在函数工作的行上运行函数?


共1个答案

匿名用户

您可以向数据中删除/添加级别。框架,以确保您的功能正常工作,而不是满足特殊情况:

# 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)