Ich entwickle ein Modell, das die Fertilität für eine Alterskohorte prognostiziert. Ich habe derzeit einen Datenrahmen wie diesen, in dem die Zeilen Alter und die Spalten Jahre sind. Der Wert in jeder Zelle ist altersspezifischen Geburten für dieses Jahr:In R, Datenrahmen Diagonalen in Zeilen konvertieren
> df1
iso3 sex age fert1953 fert1954 fert1955
14 AUS female 13 0.000 0.00000 0.00000
15 AUS female 14 0.000 0.00000 0.00000
16 AUS female 15 13.108 13.42733 13.74667
17 AUS female 16 26.216 26.85467 27.49333
18 AUS female 17 39.324 40.28200 41.24000
Doch was ich will, ist jede Zeile eine Kohorte zu sein. Da die Zeilen und Spalten einzelne Jahre darstellen, können die Kohorten-Daten erhalten werden, indem die Diagonale erhalten wird. Ich suche ein Ergebnis wie folgt aus:
> df2
iso3 sex ageIn1953 fert1953 fert1954 fert1955
14 AUS female 13 0.000 0.00000 13.74667
15 AUS female 14 0.000 13.42733 27.49333
16 AUS female 15 13.108 26.85467 41.24000
17 AUS female 16 26.216 40.28200 [data..]
18 AUS female 17 39.324 [data..] [data..]
Hier ist die df1
Datenrahmen:
df1 <- structure(list(iso3 = c("AUS", "AUS", "AUS", "AUS", "AUS"), sex = c("female",
"female", "female", "female", "female"), age = c(13, 14, 15,
16, 17), fert1953 = c(0, 0, 13.108, 26.216, 39.324), fert1954 = c(0,
0, 13.4273333333333, 26.8546666666667, 40.282), fert1955 = c(0,
0, 13.7466666666667, 27.4933333333333, 41.24)), .Names = c("iso3",
"sex", "age", "fert1953", "fert1954", "fert1955"), class = "data.frame", row.names = 14:18)
EDIT:
Hier ist die Lösung, die ich letztlich verwendet. Es basiert auf Davids Antwort, aber ich musste dies für jedes Level von iso3
tun.
df.ls <- lapply(split(f3, f = f3$iso3), FUN = function(df1) {
n <- ncol(df1) - 4
temp <- mapply(function(x, y) lead(x, n = y), df1[, -seq_len(4)], seq_len(n))
return(cbind(df1[seq_len(4)], temp))
})
f4 <- do.call("rbind", df.ls)
Haben Sie einfach hinken wollen Datensatz? –
Ja, aber ich denke, das wäre sehr umständlich. Ich mache das für 188 Länder über 50 Jahre. Wenn Sie sich einen guten Weg vorstellen können, könnte das eine gute Lösung sein. – rsoren