2015-03-19 50 views
1

我有2個dataframes其中即時試圖值在一個與另一 如果該值在這兩個表1和2相匹配進行比較,然後,從表2的第三值被插入到表一。R:ifelse語句:比較data.frames

表我的DF

words number 
1  it  1 
2  was  2 
3  the  3 
4  LTD QTY 4 
5  end  5 
6  of  6 
7 winter  7 

表x.sub

lev_dist Var1 Var2 
31  1 LTD QTY LTD QTY 

我想說的是,如果在VAR1是x.sub等於在myDF上,然後插入X的話是什麼.sub.lev_dist在mydf中的單詞旁邊的第三列

我的嘗試在下方,但在結果中保持生成3而不是lev_value

mydf$lev_dist <- ifelse(test = (mydf$words == x.sub$Var1),x.sub$Var1,0) 

結果:

words number lev_dist 
1  it  1  0 
2  was  2  0 
3  the  3  0 
4 LTD QTY  4  3 
5  end  5  0 
6  of  6  0 
7 winter  7  0 

誰能幫

+0

檢查x.sub $ Var1爲因素。在這種情況下,嘗試'as.character(x.sub $ VAR1),0)' – akrun 2015-03-19 13:06:41

+0

你是絕對正確的...這是一個非常嚴重的錯誤,使但是謝謝你撿起來......最後的答案是: mydf $ lev_dist < - ifelse(test =(mydf $ words == as.character(x.sub $ Var1)),x.sub $ lev_dist,0) 如果你能告訴我如何標記你的答案,我會做它 – 2015-03-19 13:11:56

+1

您也可以嘗試解決它*有效利用*了'data.table'包,其二進制加盟,這些方針的東西'庫(data.table); temp < - setkey(setDT(x.sub [1:2]),Var1);溫度[是myDF]' – 2015-03-19 13:16:47

回答

2

x.sub$Var1factor列。所以,當我們做ifelse時,我們得到數字levels的因子。在ifelse

mydf$lev_dist <- ifelse(mydf$words == as.character(x.sub$Var1)), 
         x.sub$lev_dist,0) 

這種替換x.sub$Var1as.character(x.sub$Var1)本來可以避免的,如果列是character類的。在read.csv/read.tabledata.frame使用stringsAsFactors=FALSE將確保所有的字符列是character類的。

2

您還可以使用merge

x.sub = setNames(x.sub,c('lev_dist','words','Var2')) 

df_ = merge(df, x.sub[,1:2], by='words', all=T) 
df_[is.na(df_)]=0 

# >df_ 
# words number lev_dist 
#1  end  5  0 
#2  it  1  0 
#3 LTD QTY  4  1 
#4  of  6  0 
#5  the  3  0 
#6  was  2  0 
#7 winter  7  0