2015-09-23 3 views
0

Я некоторые R, который, например:Логическая обработка списков в R

x<-c(-3,1,-5,7,-10) 
y<-c(1,2,3,4,5) 

Я хочу проверить элементы х против некоторого условия, т.е. < 0, и если это правда, манипулируют у на основе что.

Например, если мой логический контроль был х < 0, то элементы [0], [2], [4] у будут изменены, то есть:

print(y) 
y=[0,2,0,3,0] 

Я гугл вокруг бит и не находят ничего, что делает его элементарным. Я уверен, что это неудача google-fu, но очень благодарна.

+2

В R, индексация начинается с 1. Вы можете попробовать 'у [х <0] <- 0 '. Ваш желаемый результат также кажется выключенным. Вы ищете 'y = [0,2,0,4,0]'? –

+0

Я думаю, что есть ошибка. Ожидаемый выход должен, вероятно, быть «0 2 0 4 0». – RHertel

+0

К сожалению, да, я имею в виду элементы 1 3 и 5, если R подсчитывается от 1. – Henry

ответ

3

Например, это добавит 1 к этим значениям.

y[x < 0] <- y[x < 0] + 1 

Предполагая, что вы хотите сохранить все элементы Y:

y <- ifelse(x < 0, 0, y) 
+1

Мой ответ очень похож на @Pierre Lafortune, особенно его гораздо более элегантный. Множество способов получить работу в R! Наслаждайтесь! – Badger

+0

Спасибо, я заработал. Я был логически проверен против -5, т. Е. У [х <-5] ... Тупой. Благодаря! – Henry

+1

Я добавил некоторые пробелы, чтобы улучшить удобочитаемость –

10
y[x < 0] <- 0 
y 
#[1] 0 2 0 4 0 

Индексация начинается с 1 в R. Мы можем подмножество y логическим индексом x < 0. Одной из сильных сторон R является способность подмножества имен, булевых чисел и чисел.

Эти две функции возвращают одинаковый выход y[c(TRUE, FALSE, TRUE, FALSE, TRUE)] и y[c(1,3,5)]. Функция пытается определить, какой тип подмножества вы делаете.

Третий случай для подмножества не может использоваться в этом примере, потому что y не имеет имен. Но если мы назвали вектор, мы тоже можем подмножить этот путь.

names(y) <- c("A", "B", "C", "D", "E") 
y[c("A", "C", "E")] 

также, что вы замедлились распорными и операторы присваивания. Он уникален для R, но <- похож на =.

x<-5 

В этом случае <- получает приоритет в порядке операций и эквивалентна x = 5, не x < -5.

+0

Спасибо, я получил его работу. Я был логически проверен против -5, т. Е. У [х <-5] ... Тупой. Благодаря! – Henry

+0

@Henry в этом случае пробел может иметь большое значение ... – RHertel

+0

Да. Скобки исправили проблему. – Henry

3

Из-за способом реализованы булевы переменные, вы можете использовать их в арифметике, как если бы они равны 0 или 1, и, следовательно, для примера вы можете использовать:

y*(x>=0) 
[1] 0 2 0 4 0 

Для метода более общего назначения, функция replace существует:

replace(y,x<0,0) 
[1] 0 2 0 4 0 
+0

Этот первый имеет то преимущество, что не было сделано никаких копий. И я думаю, что это тоже быстрее. –

+0

@RichardScriven Это зависит от: http://adv-r.had.co.nz/memory.html#modification – James

+0

@RichardScriven Если вы хотите узнать все об этом, эта операция выполняет замену по ссылке: 'library (data. Таблица); setDT (list (y)) [x <0, V1: = 0] '(насколько я могу судить, глядя на« адрес »до и после). Взято из ответа eddi: http://stackoverflow.com/questions/30344192/sub-assign-by-reference-on-vector-in-r – Frank

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