我试图摆脱 R 脚本中的所有 for 循环,以加快代码的运行时间。

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

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

我有一个 ID 向量 ( pip$ID ),它有 250k 条记录,只有唯一值。
我有第二个与失败实例 (dat$PIPE_ID) 相关的 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 循环的情况下实现这一目标?

最佳答案

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

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

关于r - (R统计包)对于向量中的每个值,统计该值在不同向量中出现的次数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41626040/

10-11 22:19
查看更多