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

时间:2017-01-13 01:31:37

标签: r vector

我试图摆脱我的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循环的情况下实现这一目标?

1 个答案:

答案 0 :(得分: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 

您可以将结果转换为numeric并轻松分配:

FAIL_COUNT = as.numeric(table(factor(PIPE_ID, levels = ID)))