合并数据框,使某些列为空白

时间:2018-08-06 22:31:02

标签: r merge left-join

我有两个数据帧。第一个包含大量的乡村俱乐部财务数据,另一个包含会员数据。这两个数据集共享一个称为“ Member_ID”的列,这是我将它们合并在一起的地方。但是,成员数据集包含我需要的标题为“ Alternate_ID”的列。但是,当我合并两个数据集时,“ Alternate_ID”列中留有很多NA值。

以下是我要执行的操作的示例:

财务数据:

Member_ID    Purchase     Purchase.Desc    Date
  1111          x               x            x
  1111          x               x            x
  1111          x               x            x
  2234          x               x            x
  2234          x               x            x
  3355          x               x            x
  3355          x               x            x
  3355          x               x            x

会员数据:

Member_ID    Alternate_ID  
1111           9876
2234           7777
3355           5252

我想要什么:

Member_ID    Purchase     Purchase.Desc    Date  Alternate_ID
  1111          x               x            x     9876
  1111          x               x            x     9876
  1111          x               x            x     9876
  2234          x               x            x     7777
  2234          x               x            x     7777
  3355          x               x            x     5252
  3355          x               x            x     5252
  3355          x               x            x     5252

我得到的是什么

Member_ID    Purchase     Purchase.Desc    Date  Alternate_ID
  1111          x               x            x     9876
  1111          x               x            x     -
  1111          x               x            x     -
  2234          x               x            x     7777
  2234          x               x            x     -
  3355          x               x            x     5252
  3355          x               x            x     -
  3355          x               x            x     -

这是我用于合并的代码。

df_finance <- transaction.csv %>% left_join(dates.csv, by = "Customer.Id")

df_finance2 <- df_finance[!is.na(df_finance$Date),]

df_finance3 <- df_finance2[!duplicated(df_finance2$Member.Id),]

colnames(df_member)[6] <- "Member.Id"

total_data <- df_member %>% left_join(df_finance3, by = "Member.Id")

1 个答案:

答案 0 :(得分:1)

您的示例的有效版本:

# create data
df_finance <- data.frame(
    member_id = c(rep(1111, 3), rep(2234, 2), rep(3355,3)),
    descrip   = rep("x", 8))

df_membership <- data.frame(
    member_id = c(1111, 2234, 3355),
    alt_id    = c(9876, 7777, 522))

# with base R
merge(df_finance, df_membership, by="member_id", all.x=T)

  member_id descrip alt_id
1      1111       x   9876
2      1111       x   9876
3      1111       x   9876
4      2234       x   7777
5      2234       x   7777
6      3355       x    522
7      3355       x    522
8      3355       x    522

# tidyverse style
dplyr::left_join(df_finance, df_membership, by="member_id")

  member_id descrip alt_id
1      1111       x   9876
2      1111       x   9876
3      1111       x   9876
4      2234       x   7777
5      2234       x   7777
6      3355       x    522
7      3355       x    522
8      3355       x    522