0

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

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

如果 DfB 中的所有因子水平和组合在 DfA 中都具有匹配的因子,则该函数可以与 mapply 一起正常工作。但是,如果 DfB 中的任何行包含 DfA 中不存在的因子水平,我会得到一个错误(因子的水平集不同)。示例:如果 DfA 包含区域 A、B 和 C 的数据,而 DfB 包含区域 A、B、C 和 D 的数据,则 mapply 返回错误;如果我删除区域 D 的行,则 mapply 函数有效。

我如何指定,如果该行包含使该函数无法运行的因子级别,则跳过它或放入 NA 并继续在该函数适用的行上运行该函数?

4

1 回答 1

0

您可以在 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)
于 2014-03-29T08:13:17.280 回答