将3个数据框连接在一起,其中可能存在重复条目

4

我有一个如下的数据框...

df = tibble(id = c(64512, 64513, 64514, 64515), 
            customer=c("a", "a", "b", "b"))

我想通过id将两个数据框连接起来,就像这样...

uvp_new = tibble(id=c(64512, 64513, 64514), uvp=c(12, 14, 16))

uvp_old = tibble(id=c(64512, 64515), uvp=c(10, 18))

根据以下逻辑:每当在 uvp_new 中有一个 uvp 条目时,我想选择该条目(忽略 uvp_old),如果在 uvp_new 中没有 uvp 条目,则我想选择来自 uvp_olduvp 条目。 感激任何帮助。
4个回答

4
你可以使用 left_join() 连接 uvp_old,然后使用 rows_update()uvp_new
library(dplyr)

df %>%
  left_join(uvp_old, by = "id") %>%
  rows_update(uvp_new, by = "id")

# A tibble: 4 x 3
     id customer   uvp
  <dbl> <chr>    <dbl>
1 64512 a           12
2 64513 a           14
3 64514 b           16
4 64515 b           18

如果在df中存在重复的id,使用rows_upsert()并将结果与df连接可能会更安全:

uvp_old %>%
  rows_upsert(uvp_new, by = "id") %>%
  right_join(df, by = "id")

2

这里是使用 transformmerge 进行的基础 R 选项

transform(
  merge(merge(df, uvp_new, by = "id", all.x = TRUE), uvp_old, by = "id", all.x = TRUE),
  uvp = ifelse(is.na(uvp.x), uvp.y, uvp.x)
)[c("id","customer","uvp")]

这提供了

     id customer uvp
1 64512        a  12
2 64513        a  14
3 64514        b  16
4 64515        b  18

1
你可以使用两个连接将它们三个连接起来,使用 suffixes 跟踪 uvp 列来自哪个数据框。然后,可以使用 coalesce 选择第一个非 NA 值。
df %>% 
  left_join(uvp_new, by = "id") %>% 
  left_join(uvp_old, by = "id", suffix = c("_new", "_old")) %>% 
  mutate(uvp = coalesce(uvp_new, uvp_old))

#      id customer uvp_new uvp_old   uvp
#   <dbl> <chr>      <dbl>   <dbl> <dbl>
# 1 64512 a             12      10    12
# 2 64513 a             14      NA    14
# 3 64514 b             16      NA    16
# 4 64515 b             NA      18    18

0

您可以在uvp_newuvp_old之间执行完全连接,以便在一个数据框中拥有所有的ID,然后将此组合数据框与df连接,并使用coalesce选择新的uvp值(如果存在)或旧的uvp值。

library(dplyr)

uvp_new %>%
  rename(uvp_n = uvp) %>%
  full_join(uvp_old %>%
  rename(uvp_o = uvp), by = 'id') %>%
  right_join(df, by = 'id') %>%
  mutate(uvp = coalesce(uvp_n, uvp_o))

#     id uvp_n uvp_o customer   uvp
#  <dbl> <dbl> <dbl> <chr>    <dbl>
#1 64512    12    10 a           12
#2 64513    14    NA a           14
#3 64514    16    NA b           16
#4 64515    NA    18 b           18

如果不需要,您可以删除uvp_nuvp_o列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接