2017-02-20 6 views
0

Nicht wirklich sicher, wie Sie das herausfinden können.Verschieben einer Faktorvariablen um eine Zeile relativ zu einer anderen

Hier ist ein Beispieldatensatz:

Bob <- sample("Bob", 6, replace = T) 
Jeff <- sample("Jeff", 6, replace = T) 
Carl <- sample("Carl", 6, replace = T) 
Name <- array(c(Bob, Jeff, Carl), dim = c(18,1)) 
Week <- c("Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6") 

variable.1 <- c("No", "No", "No", "Yes", "No", "No", 
      "Yes", "No", "No", "No", "Yes", "No", 
      "No", "Yes", "No", "No", "No", "Yes") 

df <- data.frame(Name, Week, variable.1) 
df 

    Name Week variable.1 
1 Bob Week 1   No 
2 Bob Week 2   No 
3 Bob Week 3   No 
4 Bob Week 4  Yes 
5 Bob Week 5   No 
6 Bob Week 6   No 
7 Jeff Week 1  Yes 
8 Jeff Week 2   No 
9 Jeff Week 3   No 
10 Jeff Week 4   No 
11 Jeff Week 5  Yes 
12 Jeff Week 6   No 
13 Carl Week 1   No 
14 Carl Week 2  Yes 
15 Carl Week 3   No 
16 Carl Week 4   No 
17 Carl Week 5   No 
18 Carl Week 6  Yes 

Was ich versuche, jeden „Ja“ in der variable.1 Spalte auf eine Reihe zu tun ist, zu bewegen, so dass es für als Faktor Variable widerspiegeln die Informationen in der Woche zuvor. Ich versuche dies durch den einzelnen (nicht den Datensatz als Ganzes) zu tun. Ich kann den besten Weg nicht herausfinden, wenn beide Variablen Faktoren sind. Im Idealfall möchte ich, dass ein NA erscheint. Ich will nicht, dass alles einfach nach oben geht. Ich möchte nur, dass ein NA an der Stelle erscheint, an der das "Ja" war, und es das "Nein" über ihm überschreiben lässt.

Also, ich würde im Idealfall wie das fertige Produkt wie "New.Col" weiter unten loo:

Name Week variable.1 New.Col 
1 Bob Week 1   No  No 
2 Bob Week 2   No  No 
3 Bob Week 3   No  Yes 
4 Bob Week 4  Yes  NA 
5 Bob Week 5   No  No 
6 Bob Week 6   No  No 
7 Jeff Week 1  Yes  NA 
8 Jeff Week 2   No  No 
9 Jeff Week 3   No  No 
10 Jeff Week 4   No  Yes 
11 Jeff Week 5  Yes  NA 
12 Jeff Week 6   No  No 
13 Carl Week 1   No  Yes 
14 Carl Week 2  Yes  NA 
15 Carl Week 3   No  No 
16 Carl Week 4   No  No 
17 Carl Week 5   No  Yes 
18 Carl Week 6  Yes  NA 
+0

machen Was Möchtest du für Situationen wie (Jeff, Woche 1, Ja) eintreten? –

+0

Ah, gute Frage. Entschuldige, dass ich nicht gesagt habe. Wird meinen Beitrag aktualisieren. Im Idealfall möchte ich, dass ein NA erscheint. Ich will nicht, dass alles einfach nach oben geht. Ich möchte nur, dass ein NA an der Stelle erscheint, an der das "Ja" war, und es das "Nein" über ihm überschreiben lässt. – user3585829

+1

Ich bin immer noch ein wenig verwirrt. Können Sie angeben, wie die neue Spalte für dieses Beispiel aussehen soll? –

Antwort

1

Lassen Sie sich dies versuchen.

Ich gehe weiter und sortiere df nach Name und Woche, nur für den Fall, dass einige der Daten nicht in Ordnung sind. (Dies wird keine fehlenden Wochen berücksichtigen!) Ich werde auch eine Kopie von variable.1 als Zeichen in newcol zu spielen mit.

Zum leichteren Verständnis, ich werde eine Schleife schreiben, aber rechnerisch gibt es bessere Möglichkeiten, dies zu tun. Diese Schleife wird in df $ Name auf jeder einzigartige Person suchen

for (person in unique(df$Name)) { 

} 

Innerhalb der Schleife ich alle Einträge in newcol für jede Person auswählen möchten.

oldvalues <- df[df$Name == person, ]$newcol 

Ich gehe dann voran und verschiebe jeden Wert um 1 Eintrag und mache den letzten Eintrag NA.

Ich möchte auch jedes Mal, wenn der alte Wert war "Ja", indem Sie diese Woche NA.

newvalues[oldvalues == "Yes"] <- NA 

Ich kann es dann in df zurückstellen.

df[df$Name == person,]$newcol <- newvalues 

Nun, da die Schleife beendet ist, können Sie df$newcol zurück in Faktoren machen entweder ohne NA als Level standardmäßig

df$newcol <- factor(df$newcol) 

oder es einen dritten Faktor Ebene

df$newcol <- factor(df$newcol, exclude = NULL) 
+0

Danke.Das scheint aber nicht zu funktionieren. Wenn ich dieses Zeug in der for-Schleife laufe bekomme ich diesen Fehler: Fehler in '[.data.frame' (df, df $ Name == Person, df $ newcol): undefinierte Spalten ausgewählt – user3585829

+0

Ich entschuldige mich. Ich habe zwei Tippfehler, die ich behoben habe. –

+0

Ausgezeichnet. Als du so sehr! – user3585829

Verwandte Themen