问题描述
我有两个数据帧
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)
为您提供所需的结果。您也可以从基础上使用merge
和if else
。
或者您可以这样做:
data <- bind_rows(data1,data2) %>%
group_by(Id) %>%
slice(n())
这两种解决方案对于加入或绑定数据框的顺序都不可靠。