2014-03-29 23 views
0

我有两个数据帧(DfA和DfB)。每个数据帧都有三个因素变量:物种,类型和地区。 DfA也有一个数值列,我想用它来根据共享属性估算DfB新列中的数值。R:映射函数返回错误:映射因子集合不同

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

如果DfB中的所有因子水平和组合都具有DfA中的匹配因子,则该函数适用于基因图谱。但是,如果DfB中的任何一行包含DfA中不存在的因子级别,则会出现错误(级别因子集合不同)。例如:如果DfA包含区域A,B和C的数据,并且DfB包含区域A,B,C和D的数据,则应用程序返回错误;如果我删除了区域D的行,则mapply函数将起作用。

我该如何指定,如果该行包含使该功能不可能的因素级别,则跳过它或将NA放入,然后继续在该函数行所用的行上运行该功能?

+0

您可以发布两个数据框的代表性样本,以及您的函数的示例代码? –

回答

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)