加入2个数据帧

时间:2015-04-09 16:21:51

标签: r

我有2个数据框,并希望在其中一个上添加匹配列

library(plyr)
d1<-data.frame(date=c("2015-01-01","2015-02-05"),s= c("b","s"),name=c("bob","frank"),number=c(10,10.44), MatchorNoMatch= as.character(c("","")))
d1
d2<-data.frame(date2=c("2015-01-01","2015-02-06"),s2= c("b","b"),name2=c("bob","george"),number2=c(10,114))
d2

d1[d1$date %in% d2$date2 &  d1$s %in% d2$s2 & d1$name %in% d2$name2 &  d1$number %in% d2$number2,"MatchorNoMatch"] <- "match"
d1

这是我运行时得到的:

> library(plyr)
> d1<-data.frame(date=c("2015-01-01","2015-02-05"),s= c("b","s"),name=c("bob","frank"),number=c(10,10.44), MatchorNoMatch= as.character(c("","")))
> d1
        date s  name number MatchorNoMatch
1 2015-01-01 b   bob  10.00               
2 2015-02-05 s frank  10.44               
> d2<-data.frame(date2=c("2015-01-01","2015-02-06"),s2= c("b","b"),name2=c("bob","george"),number2=c(10,114))
> d2
       date2 s2  name2 number2
1 2015-01-01  b    bob      10
2 2015-02-06  b george     114
> 
> d1[d1$date %in% d2$date2 &  d1$s %in% d2$s2 & d1$name %in% d2$name2 &  d1$number %in% d2$number2,"MatchorNoMatch"] <- "match"
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "match") :
  invalid factor level, NA generated
> d1
        date s  name number MatchorNoMatch
1 2015-01-01 b   bob  10.00           <NA>
2 2015-02-05 s frank  10.44    

我在MatchOrNoMatch列中获得了NA。有什么想法吗?

===========我只是需要把stringASFactors = FALSE

这就是为什么使用%in%赢得了工作。 Bob shoudl不是一场比赛

library(plyr)
d1<-data.frame(date=c("2015-01-01","2015-02-05","2015-01-01"),s= c("b","s","s"),name=c("bob","frank","g"),number=c(10,10.44,66), match= as.character(c("","","")),stringsAsFactors= FALSE)
d1
class(d1$match)
d2<-data.frame(date2=c("2015-01-15","2015-02-05","2015-01-01"),s2= c("b","s","s"),name2=c("bob","frank","g"),number2=c(10,10.44,55),stringsAsFactors= FALSE)
d2

d1[d1$date %in% d2$date2 &  d1$s %in% d2$s2 & d1$name %in% d2$name2 &  d1$number %in% d2$number2,"match"] <- d2[d1$date %in% d2$date2 &  d1$s %in% d2$s2 & d1$name %in% d2$name2 &  d1$number %in% d2$number2, "name2"]
d1

1 个答案:

答案 0 :(得分:0)

仅使用R。

中的基本merge命令就可以轻松完成
d2$name2<-d2$name
merge(d1,d2,all.x=TRUE)
        date s  name number name2
1 2015-01-01 b   bob  10.00   bob
2 2015-02-05 s frank  10.44  <NA>

merge(d1,d2,by=c("date","s","name","number"),all.x=TRUE)

已编辑您想要匹配的特定列名。