Sto sviluppando un modello che prevede una fertilità completa per una coorte di età. Al momento ho una cornice dati come questa, dove le righe sono invecchiate e le colonne sono anni. Il valore in ogni cella è la fertilità età-specifica per quell'anno:In R, convertire le diagonali dei frame di dati in righe
> 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
Tuttavia, quello che voglio è ogni riga di essere una coorte. Poiché le righe e le colonne rappresentano singoli anni, i dati di coorte possono essere ottenuti ottenendo la diagonale. Sto cercando un risultato come questo:
> 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..]
Ecco il frame di dati df1
:
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:
Ecco la soluzione che ho usato alla fine. Si basa sulla risposta di David, ma dovevo farlo per ogni livello di iso3
.
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)
Vuoi solo ad essere in ritardo voi set di dati? –
Sì, ma penso che sarebbe molto complicato. Lo sto facendo per 188 paesi da oltre 50 anni. Se riesci a pensare a un buon modo per farlo, potrebbe essere una buona soluzione. – rsoren