Sie können Ihren Daten mithilfe verschiedener Techniken eine Spalte hinzufügen. Die folgenden Anführungszeichen stammen aus dem Abschnitt "Details" des entsprechenden Hilfetextes [[.data.frame
.
Datenrahmen können in verschiedenen Modi indiziert werden. Wenn [
und [[
mit einem einzelnen Vektorindex ( x[i]
oder x[[i]]
) verwendet werden, indizieren sie den Datenrahmen wie eine Liste.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
Die data.frame-Methode für $
wird x
als Liste behandelt
my.dataframe$new.col <- a.vector
Wenn [
und [[
mit zwei Indizes ( x[i, j]
und x[[i, j]]
) verwendet werden, wirken sie wie die Indizierung einer Matrix
my.dataframe[ , "new.col"] <- a.vector
Da die Methode für data.frame
davon ausgeht, dass Sie Spalten meinen, wenn Sie nicht angeben, ob Sie mit Spalten oder Zeilen arbeiten.
In Ihrem Beispiel sollte dies funktionieren:
# make some fake data
your.df <- data.frame(no = c(1:4, 1:7, 1:5), h_freq = runif(16), h_freqsq = runif(16))
# find where one appears and
from <- which(your.df$no == 1)
to <- c((from-1)[-1], nrow(your.df)) # up to which point the sequence runs
# generate a sequence (len) and based on its length, repeat a consecutive number len times
get.seq <- mapply(from, to, 1:length(from), FUN = function(x, y, z) {
len <- length(seq(from = x[1], to = y[1]))
return(rep(z, times = len))
})
# when we unlist, we get a vector
your.df$group <- unlist(get.seq)
# and append it to your original data.frame. since this is
# designating a group, it makes sense to make it a factor
your.df$group <- as.factor(your.df$group)
no h_freq h_freqsq group
1 1 0.40998238 0.06463876 1
2 2 0.98086928 0.33093795 1
3 3 0.28908651 0.74077119 1
4 4 0.10476768 0.56784786 1
5 1 0.75478995 0.60479945 2
6 2 0.26974011 0.95231761 2
7 3 0.53676266 0.74370154 2
8 4 0.99784066 0.37499294 2
9 5 0.89771767 0.83467805 2
10 6 0.05363139 0.32066178 2
11 7 0.71741529 0.84572717 2
12 1 0.10654430 0.32917711 3
13 2 0.41971959 0.87155514 3
14 3 0.32432646 0.65789294 3
15 4 0.77896780 0.27599187 3
16 5 0.06100008 0.55399326 3
Einfach: Ihr Datenrahmen ist A.
Dann erhalten Sie die Spalte b.
quelle
cumsum(b) -> b
Ergebnis direkt als Spalte zum ursprünglichen Datenrahmen hinzugefügt wird, so etwas wieA$groups <- cumsum(b)
.cumsum(b)
geben Sie einen Vektor der Länge 3, oder fehlt mir etwas?your.df
Daten können Sie einfachyour.df$group = cumsum(your.df[, 1]==1)
Ihre neue Gruppenspalte abrufen.Wenn ich die Frage richtig verstehe, möchten Sie erkennen, wenn sich die Frage
h_no
nicht erhöht, und dann die Frage erhöhenclass
. (Ich werde durchgehen, wie ich dieses Problem gelöst habe. Am Ende gibt es eine in sich geschlossene Funktion.)Arbeiten
Die
h_no
Spalte ist uns momentan nur wichtig, daher können wir sie aus dem Datenrahmen extrahieren:Wir wollen erkennen, wann
h_no
nicht steigt, was wir tun können, indem wir herausfinden, wann der Unterschied zwischen aufeinanderfolgenden Elementen entweder negativ oder null ist. R liefert diediff
Funktion, die uns den Vektor der Unterschiede gibt:Sobald wir das haben, ist es einfach, diejenigen zu finden, die nicht positiv sind:
In R
TRUE
undFALSE
sind im Grunde die gleichen wie1
und0
. Wenn wir also die kumulative Summe von erhaltennonpos
, erhöht sie sich um 1 in (fast) den entsprechenden Stellen. Diecumsum
Funktion (die im Grunde das Gegenteil von istdiff
) kann dies tun.Es gibt jedoch zwei Probleme: Die Zahlen sind eins zu klein; und wir vermissen das erste Element (es sollten vier in der ersten Klasse sein).
Das erste Problem ist einfach gelöst:
1+cumsum(nonpos)
. Und das zweite erfordert nur das Hinzufügen eines a1
an der Vorderseite des Vektors, da das erste Element immer in der Klasse ist1
:Jetzt können wir es mit wieder an unseren Datenrahmen anhängen
cbind
(mithilfe derclass=
Syntax können wir der Spalte dieclass
Überschrift geben):Und
data_w_classes
enthält jetzt das Ergebnis.Endergebnis
Wir können die Zeilen zusammen komprimieren und alles in eine Funktion zusammenfassen, um die Verwendung zu vereinfachen:
Oder, da es Sinn macht für die
class
, ein Faktor zu sein:Sie verwenden eine der folgenden Funktionen:
(Diese Methode zur Lösung dieses Problems ist gut, da sie eine explizite Iteration vermeidet, die im Allgemeinen für R empfohlen wird, und das Erzeugen vieler Zwischenvektoren und Listen usw. vermeidet. Außerdem ist es ziemlich ordentlich, wie es in eine Zeile geschrieben werden kann :))
quelle
Zusätzlich zu Romans Antwort könnte so etwas noch einfacher sein. Beachten Sie, dass ich es nicht getestet habe, da ich momentan keinen Zugriff auf R habe.
Die Funktion durchläuft die Werte in
n_ho
und gibt immer die Kategorie zurück, zu der der aktuelle Wert gehört. Wenn ein Wert von1
erkannt wird, erhöhen wir die globale Variableindex
und fahren fort.quelle
Ich glaube, dass die Verwendung von "cbind" der einfachste Weg ist, eine Spalte zu einem Datenrahmen in R hinzuzufügen. Unten ein Beispiel:
quelle
quelle
Ansatz basierend auf der Identifizierung der Anzahl der Gruppen (
x
inmapply
) und ihrer Länge (y
inmapply
)quelle