2017-06-01 3 views
0

Ich mag verschiedene Aggregationen in einer Schleife durchzuführen, um verschiedene Reihen Subsets meiner Daten angewandt werden, aber es scheint heikel (wenn überhaupt) zu erreichen:Kann ich mit Parametern aus Datenrahmen aggregieren?

t <- data.frame(agg=c(list("field1"=field1, "field2"=field2), ...), 
       fun=c(mean, ...)) 
f <- function(x) { 
    for (i in 1:nrow(t) { 
     y <- aggregate(x, by=t$agg[i], FUN=t$fun[i]) 
     # do something with y 
    } 
} 

Ein Problem ist, dass das Feld Liste agg löst einen Fehler beim Versuch, den Datenrahmen zu erstellen ("Objekt 'Feld1' nicht gefunden"), und das andere Problem ist, dass R nicht fun einen Funktionswert zuweisen möchte ("kann Klasse nicht erzwingen" " Funktion "" zu einem data.frame ").

Anhang: Ein konkretes Beispiel für meine Daten (nur über die Definitionen entsprechen) könnte sein:

> d <- data.frame(field1=round(rnorm(5, 10, 1)),field2=letters[round(rnorm(5, 10, 1))], field3=1:5) 
> d 
    field1 field2 field3 
1  11  j  1 
2  11  i  2 
3  10  j  3 
4  12  i  4 
5  11  j  5 
> with(d, aggregate(d$field3,by=list(field1, field2),FUN=mean)) 
    Group.1 Group.2 x 
1  11  i 2 
2  12  i 4 
3  10  j 3 
4  11  j 3 

Tricks mit den Variablennamen in dem Datenrahmen Spielen, ich diese noch erhalten:

> with(d,t <- data.frame(agg=c(list("field1"=field1, "field2"=field2)),fun=c(mean))) 
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
    cannot coerce class ""function"" to a data.frame 
+0

'by' Argument sollte einen Vektor der gleichen Länge wie' x' haben. Ist diese Bedingung erfüllt? Können Sie ein reproduzierbares Beispiel geben? –

+0

Warum würden Sie anstelle einer Liste einen Datenrahmen dafür verwenden? – LAP

+0

@Leo P: Ist _ "Warum würden Sie einen Datenrahmen anstelle einer Liste verwenden?" _ Bedeutet, dass Sie eine Lösung für eine Liste haben? –

Antwort

0

Die Probleme waren mehrere, meist durch R Herstellung Ausnahmen von allgemeiner Verarbeitung verursacht:

  • Zuerst kann ein Vektor nicht verschachtelt werden, sondern nur Listen. Immer noch müssen alle Elemente den gleichen Typ haben.
  • Zweitens, data.frame macht einige magische Behandlung beim Konstruieren der Variablen (verursacht die Unfähigkeit, Schließungen zuweisen), so dass es nicht verwendet werden kann.
  • Endlich hatte ich namentlich

So die Definition wie folgt aussieht (wo , ... bedeutet „fügen Sie mehr ähnliche Produkte“), um Variablen zu aggregieren verweisen:

t <- list(agg=list(c("field1", "field2"), ...), 
      fun=list(mean, ...)) 

f <- function(x) { 
    for (i in 1:length(t$agg)) { 
     agg <- t$agg[[i]] 
     aggList <- lapply(agg, FUN=function(e) x[[e]]) 
     names(aggList) <- agg 
     y <- aggregate(x, by=aggList, FUN=t$fun[[i]]) 
     # do something with y 
    } 
} 

Hinweis: In dem aktuellen Lösung Ich fügte eine andere Liste hinzu, die die Namen der Spalten enthält, die für den aggregierten Datenrahmen auszuwählen sind, um Warnungen über mean zu vermeiden, die NA zurückgeben.

Verwandte Themen