这里有一个小代码来说明我的问题:分配矢量另一个向量
x <- 1:10
# > x
# [1] 1 2 3 4 5 6 7 8 9 10
y <- rep(letters[1:2], 5)
# > y
# [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
z <- rep(c(5,4), 5)
# > z
# [1] 5 4 5 4 5 4 5 4 5 4
现在,这取决于在我发出接下来的两个命令其为了我得到不同的subassignments:
x
第一个,y
第二个:x[(x == 2) & (y != "a") & (z == 4)] <- "a" # > x # [1] "1" "a" "3" "4" "5" "6" "7" "8" "9" "10" y[(x == 2) & (y != "a") & (z == 4)] <- "a" # > y # [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
y
第一,x
秒:y[(x == 2) & (y != "a") & (z == 4)] <- "a" # > y # [1] "a" "a" "a" "b" "a" "b" "a" "b" "a" "b" x[(x == 2) & (y != "a") & (z == 4)] <- "a" # > x # [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
第二向量的分配取决于在前面的向量进行分配。因此,在第二项任务中,我需要确保我的相关指数仍可用于第二次分配。我的第一个想法是:
x[ind <- ((x == 2) & (y != "a") & (z == 4))] <- "a"
y[ind] <- "a"
rm(ind)
我想避免一个单独的调用来完成给定的,我可能会做了很多本该ind
矢量的分配。这仍然会被认为是R
的良好编码,还是会导致我没有想到的任何迂回行为?
如果要更改的'x'和'y'的元素索引相同,则您的想法有效。此外,你避免了重复的计算(你正在调用两次'(x == 2)&(y!=“a”)&(z == 4)')。一步一步做,你在'y'之前改变'x',这可能会影响你想改变的'y'元素的计算。 – nicola 2014-10-27 11:07:28
在你的情况下,我会尝试创建2个不同的向量,如xx和yy,并对它们做如下操作:''yy [(x == 2)&(y!=“a”)&(z == 4)] < - “a”'',所以你不会改变条件 – 2014-10-27 11:10:26
我刚刚更新了这个问题,强调我想要索引可用,并且我想以清晰的方式做到这一点,但同时避免独立呼叫做'ind'向量的分配。在'R'中,这仍然被认为是好的编码。 – 2014-10-27 11:12:58