【发布时间】:2014-10-27 10:54:24
【问题描述】:
这里有一个小代码来说明我的问题:
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
现在,根据我发出接下来两个命令的顺序,我会得到不同的子分配:
-
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元素的计算。 -
在您的情况下,我会尝试创建 2 个不同的向量,例如 xx 和 yy,并对它们进行操作,例如:
yy[(x == 2) & (y != "a") & (z == 4)] <- "a",因此您不会更改条件 -
我刚刚更新了这个问题,强调我希望索引可用并且我想以一种清晰的方式做到这一点,但同时避免单独调用来分配 @ 987654338@ 向量。在
R中这仍然被认为是好的编码吗?
标签: r variable-assignment