【问题标题】:Assign vector in indexing another vector在索引另一个向量时分配向量
【发布时间】: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 中这仍然被认为是好的编码还是会导致我没有想到的任何狡猾行为?

【问题讨论】:

  • 如果你想改变的xy的元素索引是一样的,你的想法就行了。此外,您避免了重复计算(您调用了两次(x == 2) &amp; (y != "a") &amp; (z == 4))。一步一步做,你在y之前更改x,这可能会影响你要更改的y元素的计算。
  • 在您的情况下,我会尝试创建 2 个不同的向量,例如 xx 和 yy,并对它们进行操作,例如:yy[(x == 2) &amp; (y != "a") &amp; (z == 4)] &lt;- "a" ,因此您不会更改条件
  • 我刚刚更新了这个问题,强调我希望索引可用并且我想以一种清晰的方式做到这一点,但同时避免单独调用来分配 @ 987654338@ 向量。在R 中这仍然被认为是好的编码吗?

标签: r variable-assignment


【解决方案1】:

您的解决方案似乎很好。但是,我仍然认为您的代码有些不好。考虑你的第一个项目符号:

x[(x == 2) & (y != "a") & (z == 4)] <- "a"
y[(x == 2) & (y != "a") & (z == 4)] <- "a"

在第 1 行,您的 numeric 变量 x 将转换为 character,因为您将 "a" 分配给 TRUE 索引,或者如果没有索引是 TRUE,则可能不会。因此,您的输出类型并不是很清楚。这是一种不好的做法,可能会导致下游的各种问题或问题。你应该保持在类型内。

这也意味着尽管 R 正确解释了比较,但上面第二行中的 x == 2 有点不清楚。然而,再一次,它可能会在更复杂的示例中引起问题。但也许您的应用程序中没有这些类型问题。

【讨论】:

  • 我应该使用identical() 而不是z == 4x == 2 不应该吗?
  • 如果我有不同类的向量(factornumericintegercharacter),我如何保持输入?
  • @lord.garbage 不,因为检查对象是否相同。考虑w &lt;- 1:3; identical(w, 2),它产生错误。
  • @lord.garbage 我想你应该只使用characters 或任何必要的类型。但我猜你在y 中使用了字母,在x 中使用了数字,以使你的示例更加清晰。
  • 啊,现在我明白你的意思了。分配例如1a 强制它成为字符向量。是的,我在示例中这样做是为了说明我的问题。抱歉,我的原始代码确实保留在类型中!
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多