join matching columns in a data.frame or data.table

前端 未结 2 1455
难免孤独
难免孤独 2020-12-16 03:14

I have the following data.frames:

a <- data.frame(id = 1:3, v1 = c(\'a\', NA, NA), v2 = c(NA, \'b\', \'c\'))
b <- data.frame(id = 1:3, v1 = c(NA, \'B         


        
2条回答
  •  无人及你
    2020-12-16 03:52

    If your data is as simple as it is above joran's answer is likely the simplest way. Here's may approach in base:

    a <- data.frame(id = 1:3, v1 = c('a', NA, NA), v2 = c(NA, 'b', 'c'))
    b <- data.frame(id = 1:3, v1 = c(NA, 'B', 'C'), v2 = c("A", NA, NA))
    
    decider <- function(x, y) factor(ifelse(is.na(x), as.character(y), as.character(x)))
    data.frame(mapply(a, b, FUN = decider))
    

    If your data has different id's (some overlap and some do not, then here's a different approach:

    a <- data.frame(id = c(1,2,4,5), v1 = c('a', NA, "q", NA), v2 = c(NA, 'b', 'c', "e"))
    b <- data.frame(id = 1:4, v1 = c(NA, "A", "C", 'B'), v2 = c("A", NA, "D", NA))
    
    decider <- function(x, y) factor(ifelse(is.na(x), as.character(y), as.character(x)))
    
    DF <- data.frame(mapply(a, b, FUN = decider))
    DF2 <- rbind(b[!b$id %in% DF$id , ], DF)
    DF2 <- DF2[order(DF2$id), ]
    rownames(DF2) <- 1:nrow(DF2)
    

提交回复
热议问题