2016-08-15 11 views
0

verwenden ich den Code unten, um einen Datenrahmen in r zu erzeugen:bedingte Operation in data.frame in r

set.seed(456) 

data_5 <- data.frame(id=factor(rep(c("A","B","c"),each=214)), 
        people=c(floor(runif(214,min=10,max=800)), 
           floor(runif(214,min=20,max=810)), 
           floor(runif(214,min=30,max=820)))) 

Q1: Ich mag eine neue Spalte hinzuzufügen, wo es die Ergebnisse angezeigt werden, die von jedem Wert in der Spalte kommen "Personen" dividiert durch den Gesamtwert, zu dem es gehört (dh jeder Wert in Kategorie A wird durch den Gesamtwert der Kategorie A geteilt, der gleiche für Kategorie B)

Q2: möchte eine neue Spalte hinzufügen wo es den Mittelwert von Kategorie A, B, C für jeden Schritt (insgesamt 214 Schritt) anzeigen soll, weiß ich, dass es eine Spalte mit 214 Werten 3 mal erzeugen wird .... aber es mag nicht das Plotten von ig beeinflussen uess.

Q3: Ich mag kumulierte Wert Form Q1 für die Kategorie A berechnen, B, C bzw.

versucht haben, diese Ergebnisse zu erhalten, indem jede Spalte zu erzeugen und integrieren, aber nur auf der Suche nach einem besseren Weg, es zu optimieren ..

Prost

+0

Können Sie zeigen, was Sie so versucht, dass es einfacher wird es für andere zu optimieren? – akrun

+0

Anfangs habe ich viele Spalten hinzugefügt, um kumulative Prozentsätze basierend auf verschiedenen Kategorien zu berechnen. Aber die Antwort unten zeigte eine sehr gute Optimierung. – hwq729

Antwort

0

Sie könnten die ave Funktion wie unten verwenden (hoffe ich Ihre Frage richtig verstanden habe). Mit der Syntax der ersten Zeile ist die Welt Ihr Ausschlag und Sie können jede Funktion angeben, die Sie auf die verschiedenen ID-Kategorien anwenden möchten. Sie können auch die Funktionen aggregate, by und tapply überprüfen, um Funktionen auf verschiedene Kategorien anzuwenden.

bearbeiten Update reflektieren in den Kommentaren zu hinterfragen:

data_5 <- data.frame(id = factor(rep(c("A","B","c"),each=214)), 
        people = c(floor(runif(214,min=10,max=800)), 
           floor(runif(214,min=20,max=810)), 
           floor(runif(214,min=30,max=820))), 
        time = rep(1:214, 3)) 

data_5$perc <- ave(data_5$people, data_5$id, FUN = function(x) x/sum(x)) 
data_5$cumperc <- ave(data_5$perc, data_5$id, FUN = cumsum) 
data_5$mean_cumperc <- ave(data_5$cumperc, data_5$time, FUN = mean) 
+0

der Code der ersten Zeile funktioniert und auch der Code der dritten Zeile (für die dritte Zeile: wenn Data_5 $ People in Data_5 $ Perc geändert wird, und FUN = Cumsum). Die zweite Zeile scheint jedoch nicht ganz gut zu funktionieren, weil ich anfing, den Durchschnitt von data_5 $ cummean zu berechnen (nimm alle Daten aus Kategorie A, B, C; füge diese drei hinzu und mittle es und wiederhole es für alle 214 Daten) – hwq729

+0

denke, es wäre hilfreich, diese Spalte hinzuzufügen, zu erklären: Time_1 <- rep (1: 214,3) data_5 $ time <- Time_1 SO: ich den Durchschnitt der kumulativen Prozent rechnen (aus jeder Kategorie) in jeder Schritt (214 insgesamt) – hwq729

+0

Siehe die neue letzte Zeile – Raad