2016-08-22 4 views
0

Я пытаюсь манипулировать вектор таким образом, чтобы он индексируется каким-либо другим булева вектора:как манипулировать (или индекс) вектор в R, используя булеву вектор

#vector 1: 
V1<-c(1,1,1,1,2,3,6,7,8,9) 

#vector 2: 
v2<-c(1,2,3,4,5) 

#condition for manipulation: 
boolean_vector<-v2<=3 

#indexing using the boolean vector, based on the condition: 
v2[boolean_vector] 
[1] 1 2 3 
V1[boolean_vector] 
[1] 1 1 1 3 6 7 

Вот мои 3 вопроса :

  1. Как лучше написать манипуляции на V2, чтобы получить тот же результат? (Я считаю, что есть лучший способ ...?)

  2. Что именно происходит, когда я использую этот метод для управления V1? Я предполагаю в соответствии с результатами, что R печатает элементы, которые имеют одинаковый номер индекса в соответствии с результатами V2, а затем перерабатывает те же результаты, что и печатные элементы, соответствующие номеру индекса элементов V2. Правильно ли это? Почему он разработан таким образом?

  3. Что такое хороший способ манипулирования различными векторами по тем же правилам? Если я просто хочу напечатать все элементы, которые меньше или равны 3, а затем использовать это правило для любого вектора?

Спасибо,

+2

Пожалуйста, задайте один вопрос в сообщении. Также где определяется 'v'? – akrun

+0

Спасибо, отредактировал - это V2 @akrun – oba2311

ответ

0

Может быть, вы можете использовать, который()?

new_v<-V2[which(V2<=3)] 

Вы можете должны прочитать функцию из которых() Введение.

3

Прежде всего, обратите внимание, что ваш вектор будет переработан для более длинного вектора (вопросы № 2)!

boolean_vector<-v2<=3 
boolean_vector 
[1] TRUE TRUE TRUE FALSE FALSE 

Оценка V1 вектора, условие будет применяться к boolean_vector V1[1:5], а затем повторить процедуру V1[6:10]. Это вряд ли будет полезно в обычных приложениях, где строки могут не содержать строго одинаковых блоков.

Для конкретного условия используйте boolean для самого вектора (вопрос № 3).

V1[V1 <= 3] 
v2[v2 <= 3] 

Если условие является сложным, сохраняя его результат в вектор, как вы делали это предпочтительнее (вопрос № 1). Чтобы обобщить сложное условие, вы можете создать функцию, которая возвращает логический вектор.

check <- function(x){ 
    res <- x <= 3 
    return(res) 
} 

V1[check(V1)] 
[1] 1 1 1 1 2 3 
v2[check(v2)] 
[1] 1 2 3 

Решение связано с комментариями Роланда в моем question.

+0

Спасибо @nya, это полезно. Итак, что касается вашего ответа на вопрос 1: , вы определяете функцию, а затем запускаете через нее вектор, чтобы управлять вектором? – oba2311

+0

@ oba2311 Да. Таким образом вы оцениваете конкретный вектор для необходимого вам условия. Это то же самое, что и в коде для ответа на вопрос №3, но это может быть не полезно, если условие является чем-то сложным. – nya

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