用R中的另一个数据框列更新一个数据框列中的几个值

问题描述

我有两个数据帧

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

解决方法

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
,

您可以使用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)
,

我会做这样的事情:

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,Col3)

为您提供所需的结果。您也可以从基础上使用mergeif else

或者您可以这样做:

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...