【问题标题】:update few values in a data frame column with another data frame column in R用 R 中的另一个数据框列更新数据框列中的几个值
【发布时间】:2020-08-18 06:50:48
【问题描述】:

我有两个数据框

df1:

Id     Name        Column3
3      name1        fdf       
12     name343      dfd
32     name65       sis
45     name23       rir
16     name98       tit

df2:使用此数据框中的新名称更新名称列。在 df1 数据框中更新相同的新名称。

Id     Name        Column3
12     newName1     dfd
45     newName34    rir
16     newName111   tit

我想根据 Id 列将 df1 中的名称替换为 df2 中的 newNames。

预期输出:

    Id     Name          Column3
    3      name1          fdf       
    12     newName1       dfd
    32     name65         sis
    45     newName34      rir
    16     newName111     tit

【问题讨论】:

    标签: r


    【解决方案1】:

    dplyr 1.0.0 添加了一个新的实验函数rows_update() 正是这样做的:

    library(tidyverse)
    
    df1 <- read_table("Id     Name        Column3
    3      name1        fdf       
    12     name343      dfd
    32     name65       sis
    45     name23       rir
    16     name98       tit")
    
    df2 <- read_table("Id     Name        Column3
    12     newName1     dfd
    45     newName34    rir
    16     newName111   tit")
    
    df1 %>% rows_update(df2, by = "Id")
    #> # A tibble: 5 x 3
    #>      Id Name       Column3
    #>   <dbl> <chr>      <chr>  
    #> 1     3 name1      fdf    
    #> 2    12 newName1   dfd    
    #> 3    32 name65     sis    
    #> 4    45 newName34  rir    
    #> 5    16 newName111 tit
    

    【讨论】:

      【解决方案2】:

      你可以使用match

      df1$Name[match(df2$Id, df1$Id)] <- df2$Name
      df1
      
      #  Id       Name Column3
      #1  3      name1     fdf
      #2 12   newName1     dfd
      #3 32     name65     sis
      #4 45  newName34     rir
      #5 16 newName111     tit
      

      如果df2 中的所有值都不存在于df1 中,那么在这种情况下加入和选择值会更安全。

      library(dplyr)
      
      df1 %>%
        left_join(df2, by = 'Id') %>%
        mutate(Name = coalesce(Name.y, Name.x)) %>%
        select(Id, Name, Column3 = Column3.x)
      

      【讨论】:

      • 这里我只给出了 3 列,在我的情况下我有 60 列,在 select 中写下所有这 60 列并不好。有没有选择所有列的替代方法
      • select 仅用于select 列。您在mutate 步骤本身中有所需的答案。如果有很多列,那么您可以使用select(Id, Name, matches('\\.x$')) 仅从df1 中选择列。
      【解决方案3】:

      我会这样做:

      library(dplyr)
      data <- data1 %>%
        left_join(data2, by = "Id") %>%
        mutate(Name = ifelse(is.na(Name.y), Name.x, Name.y),
               Col3 = ifelse(is.na(Col3.y), Col3.x, Col3.y)) %>%
        select(Id, Name, Col3)
      

      为您提供所需的结果。您也可以从 base 中使用 mergeif else

      或者你可以这样做:

      data <- bind_rows(data1, data2) %>%
        group_by(Id) %>% 
        slice(n()) 
      

      对于您加入或绑定数据框的顺序而言,这两种解决方案都不可靠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-18
        • 2019-11-23
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        相关资源
        最近更新 更多