【问题标题】:joining data frames and substitutung rows连接数据框和替换行
【发布时间】:2018-08-24 13:22:15
【问题描述】:

我有一个这样的表:data1

  V1 V2 V3
1  a  d  t
2  b  d  w
3  c  e  t
4  a  d  t
5  b  f  w
6  c  g  t
7  a  h  w
8  b  k  w
9  c  e  w

和数据2:

  V1 V2 V3
1  a  d  w
2  b  f  t
3  c  e  t

现在,对于 V1 和 V2 中相同的所有行,我想用 data2 中的 V3 替换来自 data1 的 V3。这样我就得到了这样的表:

   V1 V2 V3
1  a  d  w
2  b  d  w
3  c  e  t
4  a  d  t
5  b  f  t
6  c  g  t
7  a  h  w
8  b  k  w
9  c  e  t

有什么想法吗?

感谢您的帮助!

【问题讨论】:

    标签: r join


    【解决方案1】:

    使用data.table 的选项是

    library(data.table)
    setDT(data1)[data2, V3 := i.V3, on = .(V1, V2)]
    data1
    #   V1 V2 V3
    #1:  a  d  w
    #2:  b  d  w
    #3:  c  e  t
    #4:  a  d  w
    #5:  b  f  t
    #6:  c  g  t
    #7:  a  h  w
    #8:  b  k  w
    #9:  c  e  t
    

    数据

    data1 <- structure(list(V1 = c("a", "b", "c", "a", "b", "c", "a", "b", 
    "c"), V2 = c("d", "d", "e", "d", "f", "g", "h", "k", "e"), V3 = c("t", 
    "w", "t", "t", "w", "t", "w", "w", "w")), row.names = c(NA, -9L
    ), class = "data.frame")
    
    data2 <- structure(list(V1 = c("a", "b", "c"), V2 = c("d", "f", "e"), 
    V3 = c("w", "t", "t")), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      我不确定这是最有效的答案,如果扩展到更大的数据帧,您需要小心。由于V3同时存在于data1和data2中并且我们没有使用它来join,join会自动附加一个后缀来区分它们。在此示例中,它非常简单,但请确保您了解在更复杂的情况下它是如何工作的。

      library(tidyverse)
      data1 <- data_frame(V1=rep(c('a','b','c'),3),
                          V2=c('d','d','e','d','f','g','h','k','e'),
                          V3=c('t','w','t','t','w','t','w','w','w'))
      
      data2 <- data_frame(V1=c('a','b','c'),
                          V2=c('d','f','e'),
                          V3=c('w','t','t'))
      
      left_join(data1,data2,by=c('V1','V2')) %>%
        mutate(V3=coalesce(V3.y,V3.x)) %>%
        select(-V3.x,-V3.y)
      
      # A tibble: 9 x 3
        V1    V2    V3   
        <chr> <chr> <chr>
      1 a     d     w    
      2 b     d     w    
      3 c     e     t    
      4 a     d     w    
      5 b     f     t    
      6 c     g     t    
      7 a     h     w    
      8 b     k     w    
      9 c     e     t 
      

      【讨论】:

      • @NinaW。没问题。如果您对我的答案和/或任何其他答案感到满意,您可以将其标记为人们知道您已选择的答案。
      【解决方案3】:

      试试这个解决方案

      您的数据框

      data1<-data.frame(V1=c("a","b","c","a","b","c","a","b","c"),
      V2=c("d","d","e","d","f","g","h","k","e"),
      V3=c("t","w","t","t","w","t","w","w","w"))
      
      data2<-data.frame(V1=c("a","b","c"),
                        V2=c("d","f","e"),
                        V3=c("w","t","t"))
      

      使用V1V2 列加入他们

      library("dplyr")
      data3<-left_join(data1,data2,by=c("V1","V2"))
      data3
        V1 V2 V3.x V3.y
      1  a  d    t    w
      2  b  d    w <NA>
      3  c  e    t    t
      4  a  d    t    w
      5  b  f    w    t
      6  c  g    t <NA>
      7  a  h    w <NA>
      8  b  k    w <NA>
      9  c  e    w    t
      

      替换适当的值

      data3[!is.na(data3[,4]),3]<-data3[!is.na(data3[,4]),4]
      

      你的输出

      data3[,-4]
        V1 V2 V3.x
      1  a  d    w
      2  b  d    w
      3  c  e    t
      4  a  d    w
      5  b  f    t
      6  c  g    t
      7  a  h    w
      8  b  k    w
      9  c  e    t
      

      【讨论】:

      • 将解决方案移至 dplyr,如您所见,我不是基本 R 代码的纯粹主义者
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2022-01-12
      • 1970-01-01
      • 2019-12-16
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多