(R 统计软件包)对于向量中的每个值,计算它在另一个向量中出现的次数

3

我想尝试在R脚本中消除所有for循环,以加快代码的运行时间。

我有一个像下面这样的for循环:

for(i in 1:x){
    pip$FAIL_COUNT[i] <- sum(dat$PIPE_ID == pip$ID[i])
}

我有一个ID的向量(pip$ID),长度为250k,只有唯一值。 我有一个与失败实例相关的第二个ID向量(dat$PIPE_ID),长度为12k,包含重复值。
并非每个pip$ID的值都在dat$PIPE_ID中表示,但是dat$PIPE_ID中的每个值都在pip$ID中表示。
我试图计算出第三个向量pip$FAIL_COUNT,记录pip$ID中的每个值在dat$PIPE_ID中出现的次数,可能是0或更多个整数。
例如:
pip$ID <- c(123, 234, 345, 456, 567, 678, 789, 890)
dat$PIPE_ID <- c(123, 123, 234, 789, 345, 123)
#calculation
pip$FAIL_COUNT
[3, 1, 1, 0, 0, 0, 1, 0]

上述for循环完美地实现了这一点。但它速度较慢。 有没有不使用for循环就能实现这个目标的方法?

1个回答

4

使用 table 函数可以对一个 factor 进行操作。由于我们没有其他数据,因此忽略了数据框部分(如果不先定义数据框,您的代码将无法运行)。

ID <- c(123, 234, 345, 456, 567, 678, 789, 890)
PIPE_ID <- c(123, 123, 234, 789, 345, 123)

table(factor(PIPE_ID, levels = ID))
# 123 234 345 456 567 678 789 890 
#   3   1   1   0   0   0   1   0 

您可以将结果转换为数字类型并轻松分配:
FAIL_COUNT = as.numeric(table(factor(PIPE_ID, levels = ID)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接