Каковы эквиваленты R для карты Perl и grep? - PullRequest
9 голосов
/ 02 августа 2010

Меня интересует (функциональная) векторная манипуляция в R.В частности, каковы R эквиваленты Perl's map и grep?

Следующий скрипт на Perl очищает четные элементы массива и умножает их на 2:

@a1=(1..8); 
@a2 = map {$_ * 2} grep {$_ % 2 == 0} @a1;
print join(" ", @a2)
# 4 8 12 16

Как это сделать в R?Я получил это далеко, используя sapply для Perl map:

> a1 <- c(1:8)
> sapply(a1, function(x){x * 2})
[1]  2  4  6  8 10 12 14 16

Где я могу прочитать больше о таких функциональных манипуляциях с массивами в R?

Также естьPerl до R разговорник, похожий на Perl Python Разговорник ?

Ответы [ 2 ]

10 голосов
/ 02 августа 2010

Быстрые:

  • Помимо sapply, в базе также есть lapply(), tapply, by, aggregate и более. Тогда есть множество дополнительных пакетов на CRAN , таких как plyr .

  • Для базового функционального программирования, как и на других языках: Reduce(), Map(), Filter(), ... все из которых находятся на одной странице справки; попробуйте help(Reduce), чтобы начать.

  • Как отмечалось в предыдущем ответе, векторизация здесь еще более уместна.

  • Что касается grep, в R фактически есть три встроенных движка регулярных выражений, включая версию на основе Perl из libpcre.

  • Кажется, вы упускаете несколько вещей из R, которые там есть. Я бы предложил хорошую недавнюю книгу по R и S; я рекомендую Chambers (2008) «Программное обеспечение для анализа данных»

7 голосов
/ 02 августа 2010

R имеет "grep", но он работает совсем не так, как вы привыкли.В R встроено что-то намного лучше: у него есть возможность создавать фрагменты массива с логическим выражением:

a1 <- c(1:8)
a2 <- a1 [a1 %% 2 == 0]
a2
[1] 2 4 6 8

Для карты вы можете применить функцию, как вы делали выше, но гораздо проще просто написать:

a2 * 2
[1]  4  8 12 16

Или за один шаг:

a1[a1 %% 2 == 0] * 2
[1]  4  8 12 16

Я никогда не слышал о разговорнике Perl to R, если вы когда-нибудь найдете его, дайте мне знать!В общем, в R меньше документации, чем в perl или python, потому что это такой нишевой язык.

...