r - 基于R中的不同值合并数据帧

标签 r merge

我有两个数据框。第一个看起来像

dat <- data.frame(matrix(nrow=2,ncol=3))
names(dat) <- c("Locus", "Pos", "NVAR")
dat[1,] <- c("ACTC1-001_1",   "chr15:35087734..35087734", "1" )
dat[2,] <- c("ACTC1-001_2 ",  "chr15:35086890..35086919", "2")

其中 chr15:35086890..35086919 表示该范围内的所有数字。

第二个看起来像:

dat2 <- data.frame(matrix(nrow=2,ncol=3))
names(dat2) <- c("VAR","REF.ALT","     FUNC")
dat2[1,] <- c("chr1:116242719",   "T/A", "intergenic" )
dat2[2,] <- c("chr1:116242855",  "A/G", "intergenic")

我想通过 dat$Pos 和 dat2$VAR 中的值合并它们。如果 dat2$VAR 中单元格中的单个数字包含在 dat$Pos 中单元格的范围内,我想合并这些行。如果这种情况发生不止一次(dat2$VAR 在 dat$Pos 中不止一个范围,我希望每次都合并)。最简单的方法是什么?

最佳答案

这是一个解决方案,很短但不是特别有效,所以我不推荐它用于大数据。但是,您似乎表示您的数据没有那么大,所以请尝试一下并告诉我:

library(plyr)

exploded.dat <- adply(dat, 1, function(x){
    parts <- strsplit(x$Pos, ":")[[1]]
    chr   <- parts[1]
    range <- strsplit(parts[2], "..", fixed = TRUE)[[1]]
    start <- range[1]
    end   <- range[2]
    data.frame(VAR = paste(chr, seq(from = start, to = end), sep = ":"), x)
})

merge(dat2, exploded.dat, by = "VAR")

如果它太慢或使用了太多内存来满足您的需求,您将不得不实现一些更复杂的东西,另一个问题看起来是一个很好的起点:Merge by Range in R - Applying Loops .

关于r - 基于R中的不同值合并数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694263/

相关文章:

删除嵌套在数据框列表中的列标题内的句点和空格

在 Docker 容器上运行管道工 API

google-apps-script - 合并 Google Docs 文档

r - 在 R 中合并单列数据框

R data.table %like% 与逻辑 AND

R 中的回归(与 Eviews 相比)

r - 寻找独特级别之间的差异

sql - ORA-38104: ON 子句中引用的列无法更新

javascript - 在 javascript 中合并两个时区感知的日期对象 - 一个用于日期,另一个用于时间

xcode - xCode中的ios git merge 冲突