【发布时间】:2019-08-01 14:07:29
【问题描述】:
我有两个数据框。由整数向量组成的一种,例如:
set.seed(10)
# create
dt1 <- data.table(INT = sample(1:110000, 10000, replace = F))
# sort
dt1 <- dt1[order(INT),]
详细说明不同整数的类别。例如:
# create
dt2 <- data.table(CAT = sample(c("A", "B", "C", "D", "E"), 1000, replace = T),
INT_START = sample(1:100000, 1000, replace = F),
INT_END = sample(1:100000, 1000, replace = F))
# ensure start <= end
tmp1 <- subset(dt2, dt2$INT_END < dt2$INT_START)
colnames(tmp1) <- c("CAT", "INT_END", "INT_START")
tmp2 <- subset(dt2, dt2$INT_END >= dt2$INT_START)
dt2 <- rbind(tmp1, tmp2)
rm(tmp1, tmp2)
# sort
dt2 <- dt2[order(CAT, INT_START),]
我需要识别与每个整数相关的类别。我可以使用 for 循环来做到这一点,例如:
dt1$CAT <- NA
for (i in 1:nrow(dt1)){
ann.ind <- which(dt2$INT_START <= dt1$INT[i] & dt2$INT_END >= dt1$INT[i])
dt1$CAT[i] <- paste0(unique(dt2$CAT[ann.ind]), collapse = "")
print(i)
}
但是,我需要将其应用于多个非常大的数据集,这太慢了。我可以通过以下方式使用 data.table 中途:
test1 <- dt2[dt1, on=.(INT_START<=INT, INT_END>=INT), allow.cartesian = T]
然后格式化结果:
if (identical(test1$INT_END, test1$INT_START)){
test1 <- test1[,c("INT_END", "CAT")]
colnames(test1) <- c("INT", "CAT")
test1 <- test1[!duplicated(test1),]
}
如何有效地配置 test1,以便每一行都有一个唯一的 INT,所有相应的类别都粘贴在 CAT 中(即 for 循环示例)?
注意。有些整数没有类别,有些则不止一个。
谢谢。
【问题讨论】:
-
做一个data.table非等连接。研究包小插曲。
标签: r performance data.table