Имеются две таблицы данных с начальными и конечными координатами для последовательностей целых чисел:
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
?