【发布时间】:2015-06-16 08:35:08
【问题描述】:
我是 data.table 的新手,但我想用它解决我的问题,因为我觉得它比“常规”data.frames 快 1000 倍。
这是我的问题:
我有什么:
2 个 data.tables dt1 和 dt2 像这样:
dt1 <- data.table(SID=paste0("S", 1:15), Chromo=rep(1:3, e=5), PP=rep(1:5, 3), P1=0, P2=0, P3=0)
set.seed(17)
dt2 <- data.table(PID=rep(paste0("P", 1:3), c(2, 6, 3)), Chr=c(1, 3, 1, 1, 2, 3, 3, 3, 2, 2, 3), start= c(1, 1, 1, 4, 2, 1, 2, 4, 2, 4, 2), end=c(3, 4, 2, 5, 4, 1, 3, 5, 3, 5, 5), val=rnorm(11))
我想要什么:
在右栏中用dt2[, val] 填充dt1,基于dt2[, PID] 和右行,基于dt1[, Chromo]=dt2[, Chr] 和dt1[, PP] 在dt2[, start] 和dt2[, end] 之间。
我现在在做什么: (至少可以说这并不让我感到自豪......)
# preparing the tables, computing dt1 rows indices
dt2[, numcol:=(1:ncol(dt1))[match(dt2[,PID], colnames(dt1))]]
setkey(dt2, Chr, start, end)
setkey(dt1, Chromo, PP)
ind_start <- dt1[dt2[,.(Chr, start)], which=T]
ind_end <- dt1[dt2[,.(Chr, end)], which=T]
dt2[,c("ind_start", "ind_end"):=list(ind_start, ind_end)]
# and feeling I'm that close but can't conclude with `data.table` so doing this "lame" `for` loop with `data.frames`.......................
df1 <- as.data.frame(dt1)
df2 <- as.data.frame(dt2)
nr_seg <- nrow(df2)
for(i in 1:nr_seg){
df1[df2[i,"ind_start"]:df2[i,"ind_end"], df2[i,"numcol"]] <- df2[i, "val"]
}
输入表和所需输出(除了我想要data.table):
dt1
# SID Chromo PP P1 P2 P3
# 1: S1 1 1 0 0 0
# 2: S2 1 2 0 0 0
# 3: S3 1 3 0 0 0
# 4: S4 1 4 0 0 0
# 5: S5 1 5 0 0 0
# 6: S6 2 1 0 0 0
# 7: S7 2 2 0 0 0
# 8: S8 2 3 0 0 0
# 9: S9 2 4 0 0 0
# 10: S10 2 5 0 0 0
# 11: S11 3 1 0 0 0
# 12: S12 3 2 0 0 0
# 13: S13 3 3 0 0 0
# 14: S14 3 4 0 0 0
# 15: S15 3 5 0 0 0
dt2
# PID Chr start end val
# 1: P2 1 1 2 -0.23298702
# 2: P1 1 1 3 -1.01500872
# 3: P2 1 4 5 -0.81726793
# 4: P3 2 2 3 0.25523700
# 5: P2 2 2 4 0.77209084
# 6: P3 2 4 5 0.36658112
# 7: P2 3 1 1 -0.16561194
# 8: P1 3 1 4 -0.07963674
# 9: P2 3 2 3 0.97287443
# 10: P3 3 2 5 1.18078924
# 11: P2 3 4 5 1.71653398
df1
# SID Chromo PP P1 P2 P3
# 1 S1 1 1 -1.01500872 -0.2329870 0.0000000
# 2 S2 1 2 -1.01500872 -0.2329870 0.0000000
# 3 S3 1 3 -1.01500872 0.0000000 0.0000000
# 4 S4 1 4 0.00000000 -0.8172679 0.0000000
# 5 S5 1 5 0.00000000 -0.8172679 0.0000000
# 6 S6 2 1 0.00000000 0.0000000 0.0000000
# 7 S7 2 2 0.00000000 0.7720908 0.2552370
# 8 S8 2 3 0.00000000 0.7720908 0.2552370
# 9 S9 2 4 0.00000000 0.7720908 0.3665811
# 10 S10 2 5 0.00000000 0.0000000 0.3665811
# 11 S11 3 1 -0.07963674 -0.1656119 0.0000000
# 12 S12 3 2 -0.07963674 0.9728744 1.1807892
# 13 S13 3 3 -0.07963674 0.9728744 1.1807892
# 14 S14 3 4 -0.07963674 1.7165340 1.1807892
# 15 S15 3 5 0.00000000 1.7165340 1.1807892
【问题讨论】:
-
您可以使用
foverlaps。您如何决定值必须放在哪个Pi列? -
@Roland,谢谢,我不知道这个功能,我去看看。至于
Pi,dt2的PID列中的Pi必须与dt1中的列名匹配 -
您可能会发现this Q&A 是一个有用的起点。似乎您的“PP”列对应于该帖子中的“pos”列。我发现@Arun 的“更新答案”非常好。
-
@Henrik,再次感谢,我确实在阅读所有问答,是的,PP 代表“物理位置”,Chr/Chromo 代表“染色体”;-)
-
@CathG 我意识到我的措辞“可能重复”可能是不幸的。因此,我只是想以不同的方式表达我对希望有帮助的问答的指示。
标签: r dataframe data.table