2014-06-24 6 views
15

Folgende Arbeiten fein:dplyr :: do() benötigt benannte Funktion?

library(dplyr) 
m <- function(df) { 
    mod <- lm(Sepal.Length ~ Sepal.Width, data = df) 
    pred <- predict(mod,newdata = df["Sepal.Width"]) 
    data.frame(df,pred) 
} 
iris %>% 
    group_by(Species) %>% 
    do(m(.)) 

Ich dachte, dass dies funktionieren würde, wenn ich eine anonyme Funktion verwendet, aber es funktioniert nicht:

iris %>% 
    group_by(Species) %>% 
    do(function(df) { 
    mod <- lm(Sepal.Length ~ Sepal.Width, data = df) 
    pred <- predict(mod,newdata = df["Sepal.Width"]) 
    data.frame(df,pred) 
    }) 
Error: Results are not data frames at positions: 1, 2, 3 

Antwort

19

Sie haben nicht eine anonyme Funktion benötigen:

library(dplyr) 
iris %>% 
    group_by(Species) %>% 
    do({ 
    mod <- lm(Sepal.Length ~ Sepal.Width, data = .) 
    pred <- predict(mod, newdata = .["Sepal.Width"]) 
    data.frame(., pred) 
    }) 
+0

So lustig wie die andere Antwort war, ist diese Antwort viel sauberer! Ich vergesse immer wieder, dass '.' ein Pronomen für den gesamten Datensatz sein kann. – AndrewMacDonald

13

Sie nicht die . loswerden können.

iris %>% 
    group_by(Species) %>% 
    do((function(df) { 
    mod <- lm(Sepal.Length ~ Sepal.Width, data = df) 
    pred <- predict(mod,newdata = df["Sepal.Width"]) 
    data.frame(df,pred) 
    })(.)) 

Das wird funktionieren. Die . ist notwendig. Die . ist Liebe. Behalte die ..

+1

Es ist der do-Punkt. –

+0

Ich liebe diese Antwort so sehr! Ich hatte das versucht, aber ich hatte vergessen, die Funktion in() zuerst zu verpacken: $ – AndrewMacDonald

+3

Könntest du erklären, was hier vor sich geht? Warum ist die Funktion in()? Und warum wird der Punkt benötigt? Und warum ist der Punkt in()? –

Verwandte Themen