r - 附加具有不同行数的列的数据框
问题描述
我正在尝试将数据框与另一个数据框的最后一列绑定,但它们的行数不同。我想用 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
如果有人可以提供帮助,我将不胜感激!
解决方案
这是一个合并/连接操作。有关这些概念的更多解释,请参见如何加入(合并)数据帧(内、外、左、右)和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
不是integer
s,那么我们现在处于“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
对象进行搜索并且某些内容未正确连接,请查看您的数字是否真正离散,或者您是否有一些浮点日期。
推荐阅读
- flutter - 打开 PopupMenuButton 时如何滚动页面 [flutter]
- android - 在 Kotlin 中处理异常的正确方法是什么?
- excel - 将excel函数分配给Excel VBA中的变量
- c - 用多线程 C 分叉一个进程
- wordpress - Woocommerce Membership API - 获取受限内容
- windows - 从 WSL2 内部访问在 Windows 中运行的本地主机?
- python - 用 selenium 定位元素后,你可以追溯/报告元素的 xpath 吗?
- oracle - 我可以使用 ansible 备份 Oracle 和 Hana 数据库吗?
- powerbi - 计算滚动平均值并用于缺失值
- charts - 为什么 Primefaces donutChart 不起作用?