首页 > 解决方案 > 附加具有不同行数的列的数据框

问题描述

我正在尝试将数据框与另一个数据框的最后一列绑定,但它们的行数不同。我想用 NA 填补这个空白,但要按组。例子:

我有df并且df_B

library(lubridate)
library(ggplot2)
library(tidyr)

date <- seq(from = as_date("2019-11-01"), to = as_date("2020-10-01"), by = "month")
            
country <- c(rep("Brazil",6), rep("UK", 6))

A <- 1:12

df <- data.frame(date, country, A)
> view(df)

         date country  A
1  2019-11-01  Brazil  1
2  2019-12-01  Brazil  2
3  2020-01-01  Brazil  3
4  2020-02-01  Brazil  4
5  2020-03-01  Brazil  5
6  2020-04-01  Brazil  6
7  2020-05-01      UK  7
8  2020-06-01      UK  8
9  2020-07-01      UK  9
10 2020-08-01      UK 10
11 2020-09-01      UK 11
12 2020-10-01      UK 12

date <- c(seq(from = as_date("2020-01-01"), to = as_date("2020-04-01"), by = "month"),
           seq(from = as_date("2020-07-01"), to = as_date("2020-10-01"), by = "month"))
            
country <- c(rep("Brazil",4), rep("UK", 4))

B <- 5:12

df_B <- data.frame(date, country, B)
> view(df_B)

        date  country B
1 2020-01-01  Brazil  5
2 2020-02-01  Brazil  6
3 2020-03-01  Brazil  7
4 2020-04-01  Brazil  8
5 2020-07-01      UK  9
6 2020-08-01      UK 10
7 2020-09-01      UK 11
8 2020-10-01      UK 12

我想要的是以下结果

         date country  A  B
1  2019-11-01  Brazil  1  NA
2  2019-12-01  Brazil  2  NA
3  2020-01-01  Brazil  3  5
4  2020-02-01  Brazil  4  6
5  2020-03-01  Brazil  5  7
6  2020-04-01  Brazil  6  8
7  2020-05-01      UK  7  NA
8  2020-06-01      UK  8  NA
9  2020-07-01      UK  9  9
10 2020-08-01      UK 10  10
11 2020-09-01      UK 11  11
12 2020-10-01      UK 12  12

如果有人可以提供帮助,我将不胜感激!

标签: rdplyr

解决方案


这是一个合并/连接操作。有关这些概念的更多解释,请参见如何加入(合并)数据帧(内、外、左、右)https://stackoverflow.com/a/6188334/3358272

使用dplyr,

library(dplyr)
left_join(df, df_B, by=c("date", "country"))
#          date country  A  B
# 1  2019-11-01  Brazil  1 NA
# 2  2019-12-01  Brazil  2 NA
# 3  2020-01-01  Brazil  3  5
# 4  2020-02-01  Brazil  4  6
# 5  2020-03-01  Brazil  5  7
# 6  2020-04-01  Brazil  6  8
# 7  2020-05-01      UK  7 NA
# 8  2020-06-01      UK  8 NA
# 9  2020-07-01      UK  9  9
# 10 2020-08-01      UK 10 10
# 11 2020-09-01      UK 11 11
# 12 2020-10-01      UK 12 12

作为“警告”的一个词,或者至少是一个简单的警告:加入类似数字的列是可以的,只要它们是有效离散的,例如integer, 或POSIXct/Date足够接近整数。如果您注意到它dput(df$date)显示了类似整数的数字,但它们实际上numeric不是integers,那么我们现在处于“R 正在做人们期望发生的事情的领域。

但是,日期可以(如果数学计算)是部分天,如

Sys.Date() + c(0, 0.5)
# [1] "2020-12-14" "2020-12-14"
dput(Sys.Date() + c(0, 0.5))
# structure(c(18610, 18610.5), class = "Date")

我们意识到表面上看起来离散的东西可能不是。更进一步,在 R 和许多/大多数其他编程语言中,具有连续(非离散)数字的“平等”概念是一件容易发生的事情。计算机在浮点数(又名double, numeric, float)方面存在限制。这是一般计算机在处理非整数方面的一个基本限制。有一些附加库或包在任意精度数学方面要好得多,但我相信大多数主流语言(这是相对/主观的,我承认)默认情况下不使用这些。Refs:为什么这些数字不相等?,浮点数学有问题吗?, 和https://en.wikipedia.org/wiki/IEEE_754

考虑到这一点,如果将来您使用Date对象进行搜索并且某些内容未正确连接,请查看您的数字是否真正离散,或者您是否有一些浮点日期。


推荐阅读