3

2 つのデータ フレームがあります。最初のものは次のように見えます

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 は、この範囲内のすべての数値を示します。

2番目は次のようになります。

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 のセルの範囲内に含まれている場合、それらの行を結合したいと考えています。これが複数回発生する場合 (dat$Pos の複数の範囲で dat2$VAR が発生する場合は、毎回マージする必要があります)。これを行う最も簡単な方法は何ですか?

4

2 に答える 2

1

これは非常に短いですが、特に効率的ではないため、大きなデータにはお勧めしません。ただし、データがそれほど大きくないことを示しているようだったので、試してみてお知らせください。

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 .

于 2012-12-04T01:53:41.720 に答える
1

これを試して、その仕組みをお知らせください。より大きなデータ セットがないと、トラブルシューティングが少し難しくなります。何らかの理由で機能しない場合は、データ テーブルからさらにいくつかの行を共有してください (具体的には一致する行)。

データをつなぎ合わせる

range.strings <- do.call(rbind, strsplit(dat$Pos, ":"))[, 2]
range.strings <- do.call(rbind, strsplit(range.strings, "\\.\\."))

mins <- as.numeric(range.strings[,1])
maxs <- as.numeric(range.strings[,2])

d2.vars <- as.numeric(do.call(rbind, str_split(dat2$VAR, ":"))[,2])
names(d2.vars) <- seq(d2.vars)

マッチを探す

# row numebr is the row in dat
# col number is the row in dat2 
matches <- sapply(d2.vars, function(v)  mins < v & v <= maxs)

マージ

# create a column in dat to merge-by
dat <- cbind(dat, VAR=NA)

# use the VAR in dat2 as the merge id
sapply(seq(ncol(matches)), function(i)
    dat$VAR <- dat2[i, "VAR"] )

merge(dat, dat2)
于 2012-12-04T01:03:31.383 に答える