2014-12-05 2 views
0

В R, как мне индексировать список значений из одного столбца R на основе указанного списка значений из другого столбца?R: список индексов строк из списка значений столбцов?

Я знаю, как выбрать и изменить отдельные номера строк, например:

> foo=data.frame(a=100*1:5,b=LETTERS[5:1]) 
> foo 
    a b 
1 100 E 
2 200 D 
3 300 C 
4 400 B 
5 500 A 
> foo$a[c(1,3,5)]= foo$a[c(1,3,5)] + c(3,2,1) 
> foo 
    a b 
1 103 E 
2 200 D 
3 302 C 
4 400 B 
5 501 A 

Но что, если вместо этого я хочу, чтобы выбрать и изменить строки с «B» значения «А», «Е», и "C"? Я думал, что which может быть правильным инструментом, но лучшее, что я смог придумать это:

> foo$a[which(is.element(foo$b,c("A","E","C")))] 
[1] 103 302 501 

В этот момент я застрял, потому что в то время как я выбрал правильные строки, они Арен 't в правильном порядке, поэтому я не могу изменять их индивидуально.

ответ

3

Удаление is.element и использовать %in% это решение, если вы не заботитесь о соответствии порядка

[править] - также может удалить which

foo$a[foo$b %in% c("A","E", "C")] 

Другая возможность заключается в том, чтобы использовать match, который обеспечит индексы каждого элемента.

foo$a[match(c("A","E","C"),foo$b)] 
[1] 500 100 300 
+0

Вы также можете отказаться от 'which'. – zx8754

+0

Это, похоже, не работает ... 'foo $ a [foo $ b% in% c (" A "," E "," C ")]' дает мне '[1] 103 302 501', как и 'foo $ a [который (foo $ b% in% c (" A "," E "," C "))]' – user1521655

+1

см. мое редактирование с 'match', я неправильно понял ваш вопрос. Я считаю, что это должно обеспечить то, что вам нужно. – cdeterman

1

Это что-то вроде этого вы хотите?

foo$a[match(c("A","E","C"),foo$b)] 
+1

Смотрите мой комментарий к ответу @cdeterman – user1521655

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