2014-10-27 4 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)'). Выполняя шаг за шагом, вы меняете 'x' перед' y', и это может повлиять на вычисление элементов 'y', которые вы хотите изменить. – nicola

+0

В вашем случае я бы попытался создать 2 разных вектора, таких как xx и yy, и сделать oparations на них, как: '' yy [(x == 2) & (y! = "A") & (z == 4)] <- "a" '', поэтому вы не измените условия –

+0

Я просто обновил вопрос, чтобы подчеркнуть, что хочу иметь доступные индексы и что я хочу сделать это в ясной форме, но в то же время избегать отдельный вызов для выполнения задания вектора 'ind'. Будет ли это считаться хорошей кодировкой в ​​'R'. –

ответ

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 правильно интерпретирует сравнение. Опять же, это может вызвать проблемы в более сложном примере. Но, возможно, у вас нет таких проблем в вашем приложении.

+0

Я должен использовать 'same()' вместо 'z == 4' и' x == 2', не так ли? –

+0

Как я могу оставаться на типе, если у меня есть векторы отдельных классов ('factor',' numeric', 'integer',' character')? –

+0

@ lord.garbage Нет, потому что проверьте, одинаковы ли объекты. Рассмотрим «w <- 1: 3; идентичные (w, 2) ', которые дают false. –

Смежные вопросы