У меня есть два фрейма данных: df1 и df2. df1 предоставляет ранг для всех целых чисел в последовательности, заданных начальных и конечных координат, для данной категории. Например:
set.seed(1)
df1 <- data.frame(CAT = c(rep(1, 1000000), rep(2, 1000000), rep(3, 1000000)),
START = c(seq(1, 10000000, 10), seq(1, 10000000, 10), seq(1, 10000000, 10)),
END = c(seq(10, 10000000, 10), seq(10, 10000000, 10), seq(10, 10000000, 10)),
RANK = sample(1:100, 3000000, replace = T))
df2 предоставляет список целых чисел и их категорий. Например:
df2 <- data.frame(CAT = sample(1:3, 100, replace = T),
INT = sample(1:15000000, 100))
Я пытаюсь определить RANK для каждого INT в df2. Я могу заставить цикл работать:
system.time({
out <- rep(NA, nrow(df2))
for (i in 1:nrow(df2)){
x <- subset(df1, df1$CAT == df2$CAT[i] &
df1$START <= df2$INT[i] &
df1$END >= df2$INT[i])
if (nrow(x) != 0){ out[i] <- x$RANK[1] }
print(i)
}
})
Однако это слишком медленно для набора данных, к которому мне нужно применить его. Кто-нибудь может предложить альтернативный метод с большей производительностью?