這裏有一個小代碼來說明我的問題:分配矢量另一個向量
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