2014-03-04 16 views
17

Ich würde gerne dplyr verwenden, um eine Tabelle nach einer Spalte zu gruppieren, dann wenden Sie eine Funktion auf die Menge der Werte in der zweiten Spalte jeder Gruppe an.dplyr: Wie man do() auf das Ergebnis von group_by anwendet?

Zum Beispiel möchte ich im folgenden Codebeispiel alle 2-Punkte-Kombinationen von Lebensmitteln, die von jeder Person gegessen werden, zurückgeben. Ich kann nicht herausfinden, wie man die Funktion richtig mit der richtigen Spalte (Nahrungsmittel) in der do() Funktion versorgt.

library(dplyr) 

person = c('Grace', 'Grace', 'Grace', 'Rob', 'Rob', 'Rob') 
foods = c('apple', 'banana', 'cucumber', 'spaghetti', 'cucumber', 'banana') 
eaten = data.frame(person, foods) 

by_person = group_by(eaten, person) 

# How to do this? 
do(by_person, combn(x = foods, m = 2)) 

Beachten Sie, dass das Codebeispiel in ?do auf meinem Rechner nicht

mods <- do(carriers, failwith(NULL, lm), formula = ArrDelay ~ date) 

Antwort

14

uns eaten wie folgt definieren lassen:

eaten <- data.frame(person, foods, stringsAsFactors = FALSE) 

1) Dann ist diese versuchen:

eaten %.% group_by(person) %.% do(function(x) combn(x$foods, m = 2)) 

geben:

[[1]] 
    [,1]  [,2]  [,3]  
[1,] "apple" "apple" "banana" 
[2,] "banana" "cucumber" "cucumber" 

[[2]] 
    [,1]  [,2]  [,3]  
[1,] "spaghetti" "spaghetti" "cucumber" 
[2,] "cucumber" "banana" "banana" 

2) Um in der Lage zu sein, etwas in der Nähe zu tun, was @Hadley in den Kommentaren beschreibt für eine zukünftige Version dieses ohne warten dplyr versuchen, wo do2here gefunden:

library(gsubfn) 
eaten %.% group_by(person) %.% fn$do2(~ combn(.$foods, m = 2)) 

geben:

$Grace 
    [,1]  [,2]  [,3]  
[1,] "apple" "apple" "banana" 
[2,] "banana" "cucumber" "cucumber" 

$Rob 
    [,1]  [,2]  [,3]  
[1,] "spaghetti" "spaghetti" "cucumber" 
[2,] "cucumber" "banana" "banana" 

Hinweis: Die letzte Zeile der Frage, die den Code in der Hilfedatei gibt, scheitert auch für mich. Diese Variante funktioniert für mich: do(jan, lm, formula = ArrDelay ~ date).

+6

In einer zukünftigen Version von dplyr können Sie etwas mehr tun, wie 'do (combn (. $ Foods, m = 2))' 'und die Komponenten werden automatisch mit nützlichen Namen. – hadley

+0

Vielen Dank für die hilfreiche Lösung! Kleiner Tippfehler in stringsAsFactors in der ersten Zeile. – zimmeee

+0

stellte diesmal eine neue ein :) – zimmeee

Verwandte Themen