【发布时间】:2019-05-29 10:50:58
【问题描述】:
给定两个数据表,其中包含整数序列的开始和结束坐标:
df1 <- data.table(CAT = c(rep("A", 3), rep("B", 3), rep("C", 3)),
START = c(1, 11, 21, 1, 21, 41, 1, 11, 21),
END = c(10, 20, 30, 20, 40, 60, 10, 20, 30)
)
df2 <- data.table(CAT = c(rep("A", 3), rep("B", 3), rep("C", 3)),
START = c(1, 11, 21, 31, 41, 51, 1, 11, 21),
END = c(5, 17, 23, 38, 48, 54, 9, 17, 26)
)
如何计算df1 中每个序列的整数个数,这些整数位于df2 中任何序列的开始和结束坐标内且匹配CAT?我目前正在使用 for 循环:
seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to"))
df1$MATCH <- NA
for (i in 1:nrow(df1)){
df2_sub <- subset(df2, df2$CAT == df1$CAT[i])
df2_int <- unlist(seq2(from = df2_sub$START, to = df2_sub$END))
df1_int <- seq(df1$START[i], df1$END[i])
df1$MATCH[i] <- length(na.omit(match(df1_int, df2_int)))
}
返回
df1
CAT START END MATCH 1: A 1 10 5 2: A 11 20 7 3: A 21 30 3 4: B 1 20 0 5: B 21 40 8 6: B 41 60 12 7: C 1 10 9 8: C 11 20 7 9: C 21 30 6
但是,我应用它的数据表和向量非常大?有人能提出提高性能的方法吗?也许使用data.table?
【问题讨论】:
-
参见 data.table 中的
foverlaps()。 -
不,没有逐行对应。
-
我还没有对所有情况都进行过测试,但是试试这个
df2[df1, sum(END - pmax(x.START, i.START) + 1, na.rm = TRUE), on = .(CAT, START >= START, START <= END), by = .EACHI]我认为它应该很快。
标签: r performance data.table sequence matching