【问题标题】:Updatea dataframe with another one on matching rows like SQL update with a join statement在匹配行上用另一个数据框更新数据框,例如使用连接语句更新 SQL
【发布时间】:2020-06-04 07:49:50
【问题描述】:

是否有任何简单的方法可以使用另一个数据帧行的子集来更新?

实际上,我想用RUPDATE x INNER JOIN y ON x.col1 = y.col1 SET x.col2 = y.col2

输入:

x <- data.frame(col1=c('a','c','b','d'), col2=c(11,34,13,25))

y <- data.frame(col1=c('a','b'), col2=c(3,5))

z <- match(x$col1,y$col1)

1 1 不适用 2 不适用

输出:

方法一

x$col2 <- y$col2[z]

方法二

x$col2[z] <- y$col2[z]

x$col2[z]

方法3

x$col2[z[!is.na(z)]] <- y$col2[z[!is.na(z)]]

期望的输出:

x 中仅更新与ycol1 中匹配的值

【问题讨论】:

    标签: r sql-update match


    【解决方案1】:

    由于您在此处需要的确切操作是 SQL 样式连接,因此 sqldf 包会派上用场:

    library(sqldf)
    
    sql <- "SELECT x.col1, COALESCE(y.col2, x.col2) AS col2
            FROM x LEFT JOIN y ON x.col1 = y.col1"
    x <- sqldf(sql)
    

    数据:

    x <- data.frame(col1=c('a','c','b','d'), col2=c(11,34,13,25))
    y <- data.frame(col1=c('a','b'), col2=c(3,5))
    

    【讨论】:

      【解决方案2】:

      你可以在base R中使用match

      x$col2[match(y$col1, x$col1)] <- y$col2
      x
      
      #  col1 col2
      #1    a    3
      #2    c   34
      #3    b    5
      #4    d   25
      

      left_joincoalesce 中的dplyr

      library(dplyr)
      
      left_join(x, y, by = 'col1') %>%
        mutate(col2 = coalesce(col2.y, col2.x)) %>%
        select(names(x))
      

      最有效的方法是更新加入data.table

      library(data.table)
      
      setDT(x)
      setDT(y)
      x[y, on=.(col1), col2:=i.col2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        相关资源
        最近更新 更多