这里有一些代码来说明我的问题:
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
中的良好编码,还是会导致我没有想到的任何狡猾的行为?
答案 0 :(得分:3)
你的解决方案似乎很好。但是,我仍然认为你的代码有些不好。考虑你的第一颗子弹:
x[(x == 2) & (y != "a") & (z == 4)] <- "a"
y[(x == 2) & (y != "a") & (z == 4)] <- "a"
在第1行,您的numeric
变量x
转换为character
,因为您将"a"
分配给TRUE
索引,如果没有索引则可能不会是TRUE
。因此,您的输出类型不是很清楚。这有点不好的做法,可能会导致下游各种各样的问题。你应该留在类型中。
这也意味着上面第二行中的x == 2
有点不清楚,尽管R正确地解释了比较。但是,它可能会在一个更详细的例子中引起问题。但也许您的应用程序中没有这些类型问题。