首页 > 解决方案 > 如何使用 R 合并具有多列的数据框?

问题描述

我制作了一个由代码组成的数据框,代码如下:

dates <- as.character(seq(as.Date('2015-01-01'),as.Date('2019-06-30'),by = "1 
day"))
dates <- as.data.frame(dates)
dates$date_general_ledger <- ymd(dates$date_general_ledger)

数据框如下所示:

 `date_general_ledger
1          2015-01-01
2          2015-01-02
3          2015-01-03
4          2015-01-04
5          2015-01-05
6          2015-01-06

然后我有包含日期​​、account_id 和 value 的数据框

`# A tibble: 6 x 3
  account_id date_general_ledger     amount
       <int> <chr>                    <dbl>
1     A      2015-01-01                 110
2     A      2015-01-03                 200
3     B      2015-01-02                  50

我正在尝试下面的代码合并

  `dates %>%
  left_join(df3, by="account_id") 

它不会将 2015-01-02 值作为“NA”而不是“A”,因为它没有在加入时考虑 account_id。

标签: rdataframejoinmergeleft-join

解决方案


这里的大问题是您的连接无效。当您连接两个数据 data.frames 时,被连接的列必须在两个 data.frames 中。datesdata.frame 不包含该列,因此您拥有的联接account_ID将不起作用。他们唯一的共同点是date_general_ledger,所以你可以加入。

dates %>%
  left_join(df3, by="date_general_ledger") %>%
  tibble()
# A tibble: 1,642 x 3
   date_general_ledger account_id amount
   <date>              <chr>       <dbl>
 1 2015-01-01          A             110
 2 2015-01-02          B              50
 3 2015-01-03          A             200
 4 2015-01-04          NA             NA
 5 2015-01-05          NA             NA
 6 2015-01-06          NA             NA
 7 2015-01-07          NA             NA
 8 2015-01-08          NA             NA
 9 2015-01-09          NA             NA
10 2015-01-10          NA             NA
# ... with 1,632 more rows

df3 %>%
  full_join(dates, by="date_general_ledger") %>%
  tibble()
# A tibble: 1,642 x 3
   account_id date_general_ledger amount
   <chr>      <date>               <dbl>
 1 A          2015-01-01             110
 2 A          2015-01-03             200
 3 B          2015-01-02              50
 4 NA         2015-01-04              NA
 5 NA         2015-01-05              NA
 6 NA         2015-01-06              NA
 7 NA         2015-01-07              NA
 8 NA         2015-01-08              NA
 9 NA         2015-01-09              NA
10 NA         2015-01-10              NA
# ... with 1,632 more rows

这些中的任何一个都是您正在寻找的吗?如果没有,那么您的datesdata.frame 需要有另一列。

dates准备data.frame时也存在一些小问题。

# This code throws an error. You should set by = "day"
dates <- as.character(seq(as.Date('2015-01-01'), as.Date('2019-06-30'), by = "1 
day"))

# This code also throws an error because that column was not defined in the data.frame.
dates$date_general_ledger <- ymd(dates$date_general_ledger)

以下代码用于设置dates.

dates <- as.character(seq(as.Date('2015-01-01'),as.Date('2019-06-30'),by = "day"))
dates <- data.frame(date_general_ledger = ymd(dates))

这是设置缩写的代码df3

df3 <- tibble(account_id = LETTERS[1:3], 
              date_general_ledger = ymd(c("2015-01-01", "2015-01-03", "2015-01-02")),
              amount = c(110, 200, 50))

推荐阅读