【问题标题】:R: Merge duplicate matches horizontallyR:水平合并重复匹配
【发布时间】:2023-03-31 12:15:01
【问题描述】:

我正在尝试合并 2 个数据帧并水平追加多个匹配项:

数据集1:

id
1 email1
1 email1b
2 email2
3 email3

数据集2:

id name
1 bob
2 rob
3 kat

我想使用合并来组合 id 上的这些数据框。当 id 为 1 存在重复匹配时,我希望按“id”合并以水平返回两个结果:

id name email 
1 bob email1 email1b
2 rob email2
3 kat email3

merge 似乎无法做到这一点,它会为重复值创建多行。还有其他想法吗?

谢谢! -R 新手

【问题讨论】:

  • 在上面进行了编辑以更准确 - cbind 在这种情况下将不起作用。
  • 对于您更新的数据集1,是一列还是两列? (因为我没有找到电子邮件的列名)。我刚刚更新了一个修改后的解决方案。

标签: r merge duplicates


【解决方案1】:

更新新

假设第一个数据集有两列,

dat1 <- read.table(text="id email
1 email1
1 email1b
2 email2
3 email3",sep="",header=T,stringsAsFactors=F)

dat2 <- read.table(text="id name
1 bob
2 rob
3 kat",sep="",header=T, stringsAsFactors=F)

res <- aggregate(email~., data=merge(dat1, dat2, by="id"), FUN=paste, collapse=" ")
res[order(res$id),]
#   id name          email
#  1  1  bob email1 email1b
#  3  2  rob         email2
#  2  3  kat         email3
  • mergeid 的两个数据集
  • aggregate 在合并的数据集上,因此属于同一 ids 的电子邮件被水平粘贴在一行中。

【讨论】:

  • 我不能依赖 cbind,因为我有重复的 ID。还有其他可以匹配 id 并附加到列中的内容吗?
  • @user3813578。现已更新
【解决方案2】:

这可能有效

id <- c(1, 1, 2, 3)
email <- c("email1", "email1b", "email2", "email3")
uid <- unique(id) 
data.frame(id=uid,email=unlist(lapply(uid,function(x) paste(email[x==id],collapse=' '))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2014-11-14
    • 2016-08-05
    • 2022-12-18
    相关资源
    最近更新 更多