2015-03-19 28 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