Angenommen, ich habe einige data.frame
df
:Anwendung data.frame raubend Funktionen über Gruppen von Zeilen
df <- read.table(text = "
P Q R
c 1 10
a 1 0
a 2 0
b 2 0
b 1 10
c 2 10
b 1 0
a 2 10
",
stringsAsFactors = FALSE,
header=T)
... und einige Funktion foo
, die eine data.frame
als Argument verwendet.
Eine Aufspaltung in kleinere df
data.frame
vorstellen kann, ist entsprechend dem Wert in einem ihrer Spalten, sagen P
und foo
auf jede dieser kleineren data.frame
Anwendung ist.
Im Folgenden zeige ich, was ich am besten kann, um dieses Problem zu lösen, aber ich vermute, dass bereits mehr rationalisierte Lösungen existieren, um eine solche natürliche Operation durchzuführen. Wenn ja, meine Frage ist: Was sind sie?
NB: Ich zeige unten zwei Anwendungsfälle; Das erste von beiden ist das, von dem ich erwarte, dass es deutlich verbessert werden kann. Was die zweite betrifft, denke ich, dass meine Lösung dafür schon so gut ist, wie sie wird; Ich füge diesen Anwendungsfall nur für den Fall ein, dass meine Vermutung falsch ist.
Meine Lösung hängt davon ab, ob foo
ist eine Funktion, die ich für den Rückgabewert nennen, oder eine, die ich nur für seine Nebenwirkungen nennen.
Für den ersten Fall (foo
für ihr Wert genannt) an, dass foo
dies:
set.seed(0)
sapply(unique(df$P), function (value) foo(df[df$P == value, ]),
simplify = FALSE)
## $c
## P Q R
## 6 c 2 10
##
## $a
## P Q R
## 2 a 1 0
##
## $b
## P Q R
## 5 b 1 10
Für den letzteren Fall:
## returns a one-row data.frame corresponding to a random row of
## dataframe
## NB: this is *just an example* for the sake of this question
foo <- function (dataframe) {
dataframe[sample(nrow(dataframe), 1), ]
}
... dann wäre meine Lösung dieses sein (foo
genannt für seine Nebenwirkung), angenommen, dass foo
ist dies:
## prints to stdout a one-row data.frame corresponding to a random
## row of dataframe
## NB: this is *just an example* for the sake of this question
foo <- function (dataframe) {
cat(str(dataframe[sample(nrow(dataframe), 1), ]))
}
... dann wäre meine Lösung sein:
set.seed(0)
for (value in unique(df$P)) foo(df[df$P == value, ])
## 'data.frame': 1 obs. of 3 variables:
## $ P: chr "c"
## $ Q: int 2
## $ R: int 10
## 'data.frame': 1 obs. of 3 variables:
## $ P: chr "a"
## $ Q: int 1
## $ R: int 0
## 'data.frame': 1 obs. of 3 variables:
## $ P: chr "b"
## Q: int 1
## R: int 10
Haben Sie sich die Funktion 'by' angeschaut? – aichao
@aichao: 'by' sieht aus wie ich suche. Möchten Sie Ihren Kommentar als Antwort posten? – kjo
Ich schlage auch vor, das dplyr-Paket und die Funktion 'group_by' zu suchen. – Dave2e