2014-10-27 110 views
1

这里有一个小代码来说明我的问题:分配矢量另一个向量

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

+0

如果要更改的'x'和'y'的元素索引相同,则您的想法有效。此外,你避免了重复的计算(你正在调用两次'(x == 2)&(y!=“a”)&(z == 4)')。一步一步做,你在'y'之前改变'x',这可能会影响你想改变的'y'元素的计算。 – nicola 2014-10-27 11:07:28

+0

在你的情况下,我会尝试创建2个不同的向量,如xx和yy,并对它们做如下操作:''yy [(x == 2)&(y!=“a”)&(z == 4)] < - “a”'',所以你不会改变条件 – 2014-10-27 11:10:26

+0

我刚刚更新了这个问题,强调我想要索引可用,并且我想以清晰的方式做到这一点,但同时避免独立呼叫做'ind'向量的分配。在'R'中,这仍然被认为是好的编码。 – 2014-10-27 11:12:58

回答

3

你的解决方案看起来很好。不过,我仍然认为你的代码有点不好。考虑您的第一个项目符号:

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

在1号线,你因为你分配"a"TRUE指数或许不是,如果没有指数TRUEnumeric变量x转换为character。因此你的输出类型不是很清楚。这是不好的做法,可能会导致下游的各种问题。你应该呆在类型中。

这也意味着上述第二行中的x == 2有些不清楚,尽管R正确地解释了比较。然而,再次,它可能导致一个更复杂的例子中的问题。但是,您的应用程序中可能没有这些类型的问题。

+0

我应该使用'identical()'而不是'z == 4'和'x == 2'吗? – 2014-10-27 11:22:53

+0

如果我有不同类别的向量('factor','numeric','integer','character'),我该如何保持类型? – 2014-10-27 11:24:58

+0

@ lord.garbage不,因为检查对象是否相同。考虑'w < - 1:3;相同(w,2)'产生错误。 – 2014-10-27 11:26:34