我有两个数据框。第一个看起来像
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/