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