如何在R中对此任务进行矢量化?

时间:2014-05-31 00:17:25

标签: r

对于特定任务,我编写了以下R脚本:

pred <- c(0.1, 0.1, 0.1, 0.2, 0.2, 0.3, 0.3)
grp <- as.factor(c(1, 1, 2, 2, 1, 1, 1))

cut <- unique(pred)
cut_n <- length(cut)
n <- length(pred)
class_1 <- numeric(cut_n)
class_2 <- numeric(cut_n)
curr_cut <- cut[1]
class_1_c <- 0
class_2_c <- 0
j <- 1
for (i in 1:n){
if (curr_cut != pred[i]) {
    j <- j + 1
    curr_cut <- pred[i]
}
if (grp[i] == levels(grp)[1])
    class_1_c <- class_1_c + 1
else
    class_2_c <- class_2_c + 1
class_1[j] <- class_1_c
class_2[j] <- class_2_c
}
cat("index:", cut, "\n")
cat("class1:", class_1, "\n")
cat("class2:", class_2, "\n")

我上面的目标是计算grp中每个唯一值pred中的因子的累计次数。例如,我得到以上输出:

index: 0.1 0.2 0.3 
class1: 2 3 5 
class2: 1 2 2 

我是R的初学者,我对此几乎没有问题:

  1. 如何让这段代码更快更简单?
  2. 是否可以对此进行矢量化并避免for循环?
  3. 是否有不同的&#34; R-esque&#34;这样做的方式?
  4. 非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

您可以先使用table

获取唯一的群组/预测计数
table(grp, pred)

#    pred
# grp 0.1 0.2 0.3
#   1   2   1   2
#   2   1   1   0

当然,这并不是你想要的。您需要累计总计,因此我们可以通过在每行中应用累积总和来调整此结果(转置以更好地匹配您的数据布局)

t(apply(table(grp, pred), 1, cumsum))

# grp 0.1 0.2 0.3
#   1   2   3   5
#   2   1   2   2