在索引另一个向量时指定向量

时间:2014-10-27 10:54:25

标签: r variable-assignment

这里有一些代码来说明我的问题:

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中的良好编码,还是会导致我没有想到的任何狡猾的行为?

1 个答案:

答案 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正确地解释了比较。但是,它可能会在一个更详细的例子中引起问题。但也许您的应用程序中没有这些类型问题。