我希望连接两个表(时间序列),同时保留每个左边的条目(而不是从右边添加一个),并且只有当它们左右存在时才从右边添加内容。 左内连接的种类(可能不存在)。
例如,我想加入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
感谢您的帮助
答案 0 :(得分:3)
您在提问中提到“时间序列”数据。这种类型的数据可以采用通用表格格式或特定的R ts
对象。 ts
类是一种特殊类型的向量或矩阵,它具有特殊属性以帮助进行时间序列分析。我们将假设您使用后一种情况,即class(A) [1] "data.frame"
。
这不是合并而是条件匹配。我们可以测试A
中的B
值是否只有一个匹配:
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会自动将字符值编码到类factor
中,而不是像您最初期望的那样编入类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)
答案 1 :(得分:1)
另一种清理和合并方法(左连接)(可能效率远低于@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