我有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
答案 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)
已编辑您想要匹配的特定列名。