2016-04-22 9 views
1

A habe einen sortierten Datenrahmen und ich möchte den Anstieg von x2 für jede ID berechnen. Die Eingabe bereits in einer bestimmten Art und Weise sortiert ist:Berechne den Anstieg zwischen den Zeilen für jede ID

ID x2 x3 x4 
1 10 11 2 
2 100 12 4 
1 20 13 10 
7 24 3 1 
1 30 14 0 
3  6 15 1 
2 90 15 1 

Ich mag würde bekommen:

ID x2 increase x3 x4 
1 10   11 2 
2 100   12 4 
1 20  +100% 13 10 
7 24    3 1 
1 30  +50% 14 0 
3  6   15 1 
2 90  -10% 15 1 

Antwort

2

Sie

df <- read.table(header=T, text=" 
ID x2 x3 x4 
1 10 11 2 
2 100 12 4 
1 20 13 10 
7 24 3 1 
1 30 14 0 
3  6 15 1 
2 90 15 1") 
df$increase <- ave(df$x2, df$ID, FUN = function(x) c(NA, diff(x)/head(x, -1))*100) 
df$increase <- ifelse(is.na(df$increase), "", sprintf("%+.0f%%", df$increase)) 
df 
# ID x2 x3 x4 increase 
# 1 1 10 11 2   
# 2 2 100 12 4   
# 3 1 20 13 10 +100% 
# 4 7 24 3 1   
# 5 1 30 14 0  +50% 
# 6 3 6 15 1   
# 7 2 90 15 1  -10% 
+0

Sie Erklärungen für diesen Befehl geben könnte tun könnte 'df $ Erhöhe <- ave (df $ x2, df $ ID, FUN = Funktion (x) c (NA, diff (x)/Kopf (x, -1)) * 100) 'in deiner Antwort? – noblabla

+0

'ave' teilt Ihre Daten mit' df $ ID' und gibt einen Vektor der Länge 'nrow (df)' zurück. Die erste Teilung, "x" ist "c (10L, 20L, 30L)", "diff (x)" ist "c (10L, 10L)" und 'head (x, 1)' ist 'c (10L, 20L) '. Sie zu teilen, gibt Ihren Zuwachs. Ich füge 'NA' hinzu, weil der erste Wert keine Erhöhung hat. – lukeA

+0

Super! Vielen Dank. – noblabla

Verwandte Themen