2010-08-02 4 views
9

Ich interessiere mich für (funktionelle) Vektormanipulation in R. Insbesondere, was sind R Äquivalente zu Perl map und grep?Was sind Rs Äquivalente zu Perls Map und Grep?

Der folgende Perl-Skript greps die auch Elemente Array und multipliziert diese mit 2:

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

Wie kann ich tun, dass in R? Ich habe weit dies mit sapply für Perl map:

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

Wo kann ich in R mehr über solche funktionellen Array Manipulationen lesen?

Gibt es auch eine Perl zu R Sprachführer, ähnlich der Perl Python Phrasebook?

Antwort

7

R hat "Grep", aber es funktioniert völlig anders als das, was Sie gewohnt sind. R hat etwas viel besser gebaut: es hat die Fähigkeit Array Scheiben mit einem Booleschen Ausdruck zu erstellen:

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

Für Karte, können Sie eine Funktion anwenden, wie Sie oben haben, aber es ist viel einfacher, nur schreiben:

a2 * 2 
[1] 4 8 12 16 

oder in einem Schritt:

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

ich noch nie von einem Perl-R-Satz Buch gehört habe, wenn Sie jemals kennen lassen Sie uns finden! Im Allgemeinen hat R weniger Dokumentation als entweder Perl oder Python, weil es eine solche Nischensprache ist.

10

Schnellen:

  • Neben sapply gibt es auch lapply(), tapply, by, aggregate und mehr in der Basis. Dann gibt es eine Menge Add-On-Paket auf CRAN wie plyr.

  • Für grundlegende funktionale Programmierung wie in anderen Sprachen: Reduce(), Map(), Filter(), ... von denen alle auf der gleichen Hilfeseite sind; Versuchen Sie help(Reduce) um loszulegen.

  • Wie in der früheren Antwort erwähnt, ist die Vektorisierung hier noch besser geeignet.

  • Wie für grep, hat R tatsächlich drei Regexp-Engines eingebaut, einschließlich einer Perl-basierten Version von libpcre.

  • Sie scheinen ein paar Dinge von R, die es gibt, zu fehlen. Ich würde ein gutes neues Buch über R und die S-Sprache vorschlagen; Meine Empfehlung wäre Chambers (2008) "Software for Data Analysis"