加入 2 个数据帧,同时保持完全向左 table
Join 2 dataframes, while keeping exact left table
我想加入两个表(时间序列),同时保留每个左边的条目(而不是从右边添加条目)并且仅当它们左右存在时才从右边添加内容。
一种左内连接(可能不存在)。
例如我想加入 A 和 B 并想要获得 AB:
A=
1
2
3
4
B=
1 X
2 Y
2 Z
4 Z
5 ZZ
AB=
1 X
2 NaN
3 NaN
4 Z
2和3是NaN因为2存在多次而3不存在右边
感谢您的帮助
您在问题中提到了 'time-series' 数据。这种类型的数据可以采用通用 table 格式或特定 R ts
对象。 ts
class 是一种特殊类型的向量或矩阵,具有特殊属性以协助时间序列分析。对于这种方法,我们假设您有后一种情况,即 class(A) [1] "data.frame"
.
的对象
这与其说是合并,不如说是条件匹配。我们可以测试 B
:
中的 A
值是否只有一个匹配项
indx <- sapply(A$col1, function(x) sum(B$col1 %in% x) == 1L)
data.frame(v1=A$col1, v2=ifelse(indx, B$col2, NaN), stringsAsFactors=FALSE)
# v1 v2
# 1 1 X
# 2 2 NaN
# 3 3 NaN
# 4 4 Z
注意:一定不要落入factor
陷阱。 R 会自动将字符值编码为 class factor
,而不是像您最初预期的那样编码为 class character
。要避免此问题,请使用 stringsAsFactors=FALSE
、
#Data
A <- data.frame(col1=1:4L)
B <- data.frame(col1=c(1,2,2,4), col2=c("X", "Y", "Z", "Z"), stringsAsFactors=FALSE)
另一种清理和合并的方法(左连接)(可能比@Pierre 的回答效率低得多):
A <- structure(list(id = 1:4), .Names = "id", row.names = c(NA, -4L ), class = "data.frame")
B <- structure(list(id = c("1", "2", "2", "4", "5"), val = c("X", "Y", "Z", "Z", "ZZ")), .Names = c("id", "val"), row.names = c(NA, 5L), class = "data.frame")
# Cleanup duplicated id in B (could be used in the merge to avoid creating a new object, done here for ease of reading)
NB <- B[!B$id %in% B$id[duplicated(B$id)],]
# left merge of A and B on id
merge(A,NB,all.x=TRUE,by="id")
给出:
id val
1 1 X
2 2 <NA>
3 3 <NA>
4 4 Z
我想加入两个表(时间序列),同时保留每个左边的条目(而不是从右边添加条目)并且仅当它们左右存在时才从右边添加内容。 一种左内连接(可能不存在)。
例如我想加入 A 和 B 并想要获得 AB:
A=
1
2
3
4
B=
1 X
2 Y
2 Z
4 Z
5 ZZ
AB=
1 X
2 NaN
3 NaN
4 Z
2和3是NaN因为2存在多次而3不存在右边
感谢您的帮助
您在问题中提到了 'time-series' 数据。这种类型的数据可以采用通用 table 格式或特定 R ts
对象。 ts
class 是一种特殊类型的向量或矩阵,具有特殊属性以协助时间序列分析。对于这种方法,我们假设您有后一种情况,即 class(A) [1] "data.frame"
.
这与其说是合并,不如说是条件匹配。我们可以测试 B
:
A
值是否只有一个匹配项
indx <- sapply(A$col1, function(x) sum(B$col1 %in% x) == 1L)
data.frame(v1=A$col1, v2=ifelse(indx, B$col2, NaN), stringsAsFactors=FALSE)
# v1 v2
# 1 1 X
# 2 2 NaN
# 3 3 NaN
# 4 4 Z
注意:一定不要落入factor
陷阱。 R 会自动将字符值编码为 class factor
,而不是像您最初预期的那样编码为 class character
。要避免此问题,请使用 stringsAsFactors=FALSE
、
#Data
A <- data.frame(col1=1:4L)
B <- data.frame(col1=c(1,2,2,4), col2=c("X", "Y", "Z", "Z"), stringsAsFactors=FALSE)
另一种清理和合并的方法(左连接)(可能比@Pierre 的回答效率低得多):
A <- structure(list(id = 1:4), .Names = "id", row.names = c(NA, -4L ), class = "data.frame")
B <- structure(list(id = c("1", "2", "2", "4", "5"), val = c("X", "Y", "Z", "Z", "ZZ")), .Names = c("id", "val"), row.names = c(NA, 5L), class = "data.frame")
# Cleanup duplicated id in B (could be used in the merge to avoid creating a new object, done here for ease of reading)
NB <- B[!B$id %in% B$id[duplicated(B$id)],]
# left merge of A and B on id
merge(A,NB,all.x=TRUE,by="id")
给出:
id val
1 1 X
2 2 <NA>
3 3 <NA>
4 4 Z