我认为“[
”的论点与机枪带相似:
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
会被重复评估,当它们在作业的任何一方配对时...所有都按预期进行。那么这有什么不对或正确,可以改进吗?
答案 0 :(得分:4)
您可以先存储索引,以便只计算一次:
idx <- datfrm$b < .5
datfrm[idx, "cc"] <- datfrm[idx, "a"]
这更易于阅读,并且在进行更改时不易出错。
我认为within
可能提供的输入最少,因此使用上面的idx
,并将原始内容替换为within()的输出:
datfrm <- within(datfrm, cc[idx] <- a[idx])