【问题标题】:How to merge two data sets by IDs based on another variable in R如何基于 R 中的另一个变量按 ID 合并两个数据集
【发布时间】:2015-01-24 20:07:57
【问题描述】:

我想合并两个带有 ID 的数据集。 Data2 是较大数据集 (data1) 的子集,它是通过删除在 data1 中标记为 1 的 Id 创建的。在示例数据中,两个数据集在 ID 426 之前具有相同的 ID。对于 ID 427,当第一个数据中的标签为 1 时,第二个数据删除该条目并继续使用顺序 ID。因此,第二个数据中的 Id 427 是第一个数据中的 428。同样,第二个数据中的 ID 1865 是第一个数据中的 1867。我如何合并这些数据集?我已经在线提供了一个样本数据。第一个数据有变量 id、date 和 tag,而第二个数据有 id1 和 date1

> dput(data1)
structure(list(id = c(426L, 427L, 428L, 429L, 430L, 431L, 432L, 
1865L, 1866L, 1867L, 1868L, 1869L, 1870L, 1871L, 2388L, 2389L, 
2390L, 2391L, 2965L, 2966L, 2967L, 2968L, 2969L, 2970L), date = structure(c(11250, 
7308, 12436, 9919, 13372, 9526, 8232, 7306, 9872, 7398, 10332, 
12967, 14288, 14053, 7311, 10268, 7772, 14477, 7309, 10228, 8917, 
10216, 10873, 8065), class = "Date"), tag = c(0L, 1L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L, 0L, 0L)), datalabel = "", time.stamp = "24 Jan 2015 22:01", .Names = c("id", 
"date", "tag"), formats = c("%8.0g", "%tdDD_mon_CCYY", "%8.0g"
), types = c(252L, 254L, 251L), val.labels = c("", "", ""), var.labels = c("", 
"", ""), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", 
"20", "21", "22", "23", "24"), version = 12L, class = "data.frame")
> 



> dput(data2)
structure(list(id1 = c(426L, 427L, 428L, 429L, 430L, 431L, 432L, 
1865L, 1866L, 1867L, 1868L, 1869L, 1870L, 1871L, 2388L, 2389L, 
2390L, 2391L, 2965L, 2966L, 2967L, 2968L, 2969L, 2970L), date1 = structure(c(11250, 
12436, 9919, 13372, 9526, 8232, 13787, 7398, 10332, 12967, 14288, 
14053, 11620, 11426, 14477, 11464, 9029, 11875, 10873, 8065, 
11233, 13848, 10204, 9535), class = "Date")), datalabel = "", time.stamp = "24 Jan 2015 22:00", .Names = c("id1", 
"date1"), formats = c("%8.0g", "%tdDD_mon_CCYY"), types = c(252L, 
254L), val.labels = c("", ""), var.labels = c("", ""), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"
), version = 12L, class = "data.frame")

【问题讨论】:

  • 欢迎来到 Stackoverflow。您的链接会产生错误:Sorry, the file you have requested does not exist. 您可能还想看看您是否可以重新编写您的问题以更清楚一点,给出特定的列名并显示数据的 sn-ps 等。
  • 可能是一个新的缩减ID作为更大数据集中的匹配变量,计算为ID - cumsum(tag==1) ....实际代码需要一个示例。
  • @Madiba 感谢您对帖子的编辑,我会看看它。另一件非常有帮助的事情是让您向我们展示结果应该是什么样子。您只是想要一个包含所有记录的结果数据框吗?
  • @Hack-R,是的,我想要一个包含所有记录的数据集。
  • @Madiba 太好了。我想我有适合你的解决方案。请看下面。

标签: r merge


【解决方案1】:

这就是你要找的吗?

data <- sqldf("select a.*, b.* from data1 a left join data2 b on a.date = b.date1")

或者可能:

data <- sqldf("select a.id, a.date from data1 a join data2 b on a.date = b.date1")

【讨论】:

  • 谢谢。但是我真正想要的是一个应该保留原始数据集(data1)的ID号的数据集。例如,新数据 ID 428 应对应于日期 2004 年 1 月 19 日,而不是 1997 年 2 月 27 日。
  • @Madiba 对不起,我误解了。试试这个,虽然这只是一个快速的猜测。如果其中任何一个是对的(或错的),请告诉我,我会相应地编辑解决方案。
  • 谢谢,代码运行良好。它在我更大的数据集上也非常快。
【解决方案2】:

据我所知,您想从其他帖子中的 cmets 中读取标签为 0 的 data1 行。这可以使用

data2 <- data1[data1$tag == 0,]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2019-01-09
    • 1970-01-01
    • 2017-09-10
    • 2018-06-18
    • 2021-08-07
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多