2015-04-09 2 views
0

У меня есть 2 кадра данных и хотите поместить колонки матча на одном из нихзапрессовки 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  

Я получаю NA в столбце MatchOrNoMatch. Есть идеи?

=========== ACTAUALLY Я просто Neede TO PUT stringASFactors = FALSE

вот почему использование% в% не будет работать. Боб не 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

Возможный дубликат [Сравнить два data.frames, чтобы найти строки в data.frame 1, которых нет в data.frame 2] (http://stackoverflow.com/questions/3171426/compare-two-data- frame-to-find-the-rows-in-data-frame-1-that-are-not-present-in) – zx8754

+0

Вместо того, чтобы существенно изменить свой вопрос, изменив его после ответа, возможно, лучше спросить новый вопрос. В этом случае, если вы добавляете 'MatchOrNoMatch = 'соответствие' 'как colum в' d2' и используете левое соединение, в результате он будет 'match', если бы было совпадение,' NA', если бы не было , – Gregor

ответ

0

Это очень легко сделать с помощью только команды базы merge из R.

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) 

редактируемого в ваших конкретных имен столбцов, которые вы хотели, чтобы соответствовать мимо.

+0

Вы можете взглянуть на редактирование. Мои столбцы имеют разные имена и ничего не возвращаются, когда я использую by.x и by.y. Спасибо. – user3022875

+0

Вам нужно, чтобы имена столбцов были одинаковыми между 'd1' и' d2' – User7598

Смежные вопросы