加入2个数据帧,同时保持精确的左表

时间:2016-09-26 15:03:22

标签: r join merge left-join inner-join

我希望连接两个表(时间序列),同时保留每个左边的条目(而不是从右边添加一个),并且只有当它们左右存在时才从右边添加内容。 左内连接的种类(可能不存在)。

例如,我想加入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

感谢您的帮助

2 个答案:

答案 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