征求对“[”的论证的类比

时间:2011-05-21 02:52:54

标签: r extract

我认为“[”的论点与机枪带相似:

set.seed(10)
datfrm <- data.frame(a= rev(letters[1:10]), b = runif(10), cc = letters[1:10] )
datfrm[datfrm$b < 0.5, "b"] <- 0

所以机关枪皮带只运行“[”的第一个参数:

               ---
               ---
               ---
               ---
datfrm[datfrm$b < 0.5, "b"] <- 0

但是,如果您只想对子集进行分配,请从另一列进行分配:

               ---                         ---
               ---                         ---
               ---                         ---
               ---                         ---
datfrm[ datfrm$b < .5, "cc"] <- datfrm[ datfrm$b < .5, "a"]

表达式datfrm$b会被重复评估,当它们在作业的任何一方配对时...所有都按预期进行。那么这有什么不对或正确,可以改进吗?

1 个答案:

答案 0 :(得分:4)

您可以先存储索引,以便只计算一次:

idx <- datfrm$b < .5
datfrm[idx, "cc"] <- datfrm[idx, "a"]

这更易于阅读,并且在进行更改时不易出错。

我认为within可能提供的输入最少,因此使用上面的idx,并将原始内容替换为within()的输出:

datfrm <- within(datfrm, cc[idx] <- a[idx])