如何计算向量和序列坐标数据帧之间的匹配?

时间:2019-05-24 14:21:30

标签: r performance data.table

给出一个包含整数序列的起始和结束坐标的数据表:

set.seed(1)

df1 <- data.table(
  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)) 

以及整数向量:

vec1 <- sample(1:100000, 10000)

如何计算vec1中df1中每个序列的开始和结束坐标内的整数数量?我目前正在使用for循环:

COUNT <- rep(NA, nrow(df1)) 
for (i in 1:nrow(df1)){
  vec2 <- seq(from = df1$START[i], to = df1$END[i])
  COUNT[i] <- table(vec2 %in% vec1)[2]
  print(i)
}
df1$COUNT <- COUNT

但是,我将其应用到的数据表和向量非常大?有谁能够提出提高性能的方法?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

一种选择是使用between

library(data.table)
df1[, count := sum(between(vec1, START, END)), by = seq_len(nrow(df1))]

答案 1 :(得分:1)

我们可以通过非等额联接来实现

df1[data.table(val = vec1),  count := .N,on = .(START < val,
      END >= val), by = .EACHI]
head(df1)

如果要通过其他方式获取输出,请使用@minem的示例

data.table(START = vec1, END = vec1)[df1, .N, 
       on = .(START >= START, END < END), by = .EACHI]
#   START END N
#1:     1   4 2
#2:     8   9 1
#3:    11  30 0

答案 2 :(得分:0)

setTimeout