2014-03-29 20 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)