2016-04-13 5 views
1

Wenn ich eine Liste habenNehmen Sie zwei Werte als eine Eingabe in R Liste

sample <- list(a = c(1:5), b = c(11:15)) 

Ich möchte eine Funktion wie die folgende

res <- lapply(sample, function(x) { sample$a + sample$b * 5}) 

schreiben und das Ergebnis wäre nur

[1] 56 62 68 74 80 

Ich weiß, dass dies durch einfache sample$a + sample$b*5 erreicht werden könnte, aber ich habe komplizierte Berechnungen, die nicht darin fallen.

+3

Ich bin nicht wirklich sicher, was du bist versuchen, hier zu erreichen. Sie geben nur eine Funktion an, bei der Sie selbst zugeben, dass sie leichter umgeschrieben werden kann, haben aber kompliziertere Berechnungen, die nicht in diese fallen. Also, auf welche Art und Weise fallen sie nicht hinein? Vielleicht wird es klarer, wenn Sie erklären, warum Sie hier "lapply" verwenden wollen. Edit: Auch der Name 'sample' war anfangs etwas verwirrend, da' sample' eine sehr häufig verwendete Funktion in R ist. Vielleicht möchten Sie zu etwas wie 'lis' wechseln. – Laterow

+0

'Beispiel $ a + Beispiel $ b * 5 'ergibt nicht das von Ihnen gemeldete Ergebnis. Voting zu schließen, als nicht klar, was Sie fragen. – nicola

+0

Sorry, ich bin sorglos –

Antwort

2

Eine Alternative mit do.call

do.call(function(a,b) a + b*5, sample) 
[1] 56 62 68 74 80 
2

können Sie tun das, mapply

mapply(function(x,y) x+y*5, sample$a, sample$b) 
+0

Oder seine freundliche wrapper 'Map()' – lmo

0

mapply() und do.call() sicher funktionieren, wenn Sie eine Liste aus irgendeinem Grund unter Verwendung verwenden. Je nach Kontext könnte jedoch eine data.frame eine bessere Datenstruktur sein.

Mit dplyr

library(dplyr) 
as.data.frame(sample) %>% 
    mutate(result = a + b * 5) 

Oder mit Basisfunktionen:

d <- as.data.frame(sample) 
transform(d, result = a + b * 5) 
1

Wir zu data.table umwandeln könnte und tun dies

library(data.table) 
setDT(sample)[, a+b*5] 
#[1] 56 62 68 74 80