Your use of HTML email corrupted your example slightly, but I was able to fix it. Please follow the Posting Guide and set your emails to Plain Text mode when posting to this mailing list in the future.

Here is one way:

# you have to be careful about mucking with factors
# convert columns to factors after you have finished
# changing values in them
# start by not creating factors in the first place
df1 <- data.frame( col1 = 1:6
                 , col2 = c( rep( "a", 3 )
                           , rep( "b", 3 )
                           )
                 , col3 = c( rep( "AA", 2 )
                           , rep( "BB", 2 )
                           , rep( "CC", 2 )
                           )
                 , col4 = c( 1, 8, 6, 9, 7, 6 )
                 , stringsAsFactors = FALSE
                 )

df2 <- data.frame( col1 = c( 1, 3, 5, 6 )
                 , col2 = c( rep( "a", 2 )
                           , rep( "b", 2 )
                           )
                 , col3 = c( rep( "AA", 1 )
                           , rep( "EE", 1 )
                           , rep( "FF", 1 )
                           , rep( "CC", 1 )
                           )
                 , col4 = c( 1, 8, 5, 9 )
                 , stringsAsFactors = FALSE
                 )

df3 <- merge( df1, df2, by = c( "col1", "col2" ), all = TRUE )
idx <- !is.na( df3$col3.y )
df3$col3.x[ idx ] <- df3$col3.y[ idx ]
df3$col4.x[ idx ] <- df3$col4.y[ idx ]
df3$col3.y <- df3$col4.y <- NULL
names( df3 )[ 3:4 ] <- c( "col3", "col4" )
df3

On Sun, 31 Jul 2016, Marine Regis wrote:

Hello,

I have two data frames with different sizes but with the same number of columns.

df1 <- data.frame(col1 = c(1:6), col2 = c(rep("a", 3), rep("b", 3)), col3 = c(rep("AA", 2), 
rep("BB", 2), rep("CC", 2)), col4=c(1,8,6,9,7,6))

df1

 col1 col2 col3 col4

1    1    a   AA    1

2    2    a   AA    8

3    3    a   BB    6

4    4    b   BB    9

5    5    b   CC    7

6    6    b   CC    6



df2< - data.frame(col1 = c(1,3,5,6), col2 = c(rep("a", 2), rep("b", 2)), col3 = c(rep("AA", 1), 
rep("EE", 1), rep("FF", 1), rep("CC", 1)), col4=c(1,8,5,9))



df2

 col1 col2 col3 col4

1    1    a   AA    1

2    3    a   EE    8

3    5    b   FF    5

4    6    b   CC    9





Based on col1 and col2, how can I replace any values in col3 and col4 of df1 
which don't match with those of df2 by the values of df2



In this example, the result will be:



df1

  col1 col2 col3 col4

1    1    a   AA    1

2    2    a   AA    8

3    3    a   EE    8

4    4    b   BB    9

5    5    b   FF    5

6    6    b   CC    9



Thanks a lot for your help.

Have a nice day

Marine

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnew...@dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to