Avoir un data.table comme suit:
station w_1 w_2
1: 1757 ar_2d lm_h_step
2: 2171 lm_h_step lm_h_step
3: 2812 lm_h_step lm_h_step
4: 4501 lm_h_step lm_h_step
5: 4642 ar_2d lm_h_step
6: 5029 ar_2d lm_h_step
7: 5480 lm_h_step lm_h_step
8: 5779 ar_2d ar_2d
9: 5792 ar_1d ar_2d
Je voudrais faire un tableau de la fréquence des méthodes par station.
Donc, le résultat attendu serait
1757 2171 2812 ...
lm_h_step 1 2 2
ar_2d 1 0 0
ar_1d 0 0 0 ...
Ce que j'ai essayé jusqu'à présent:
apply(dat,1,table)
produit le bon résultat, mais il n’est pas correctement formaté.
Des idées?
Débit des données:
structure(list(station = c(1757L, 2171L, 2812L, 4501L, 4642L,
5029L, 5480L, 5779L, 5792L), w_1 = c("ar_2d", "lm_h_step", "lm_h_step",
"lm_h_step", "ar_2d", "ar_2d", "lm_h_step", "ar_2d", "ar_2d"),
w_2 = c("lm_h_step", "lm_h_step", "lm_h_step", "lm_h_step",
"lm_h_step", "lm_h_step", "lm_h_step", "ar_2d", "ar_2d")), .Names = c("station",
"w_1", "w_2"), class = c("data.table", "data.frame"), row.names = c(NA,
-9L))
Réponses:
5 pour la réponse № 1Essayer dcast/melt
combinaison
Pour data.table
v> = 1.9.5 utilisez ceci
dcast(melt(dat, "station"), value ~ station, length)
# value 1757 2171 2812 4501 4642 5029 5480 5779 5792
# 1: ar_1d 0 0 0 0 0 0 0 0 1
# 2: ar_2d 1 0 0 0 1 1 0 2 1
# 3: lm_h_step 1 2 2 2 1 1 2 0 0
Pour data.table
v <1.9.5 vous aurez aussi besoin de charger reshape2
et utiliser explicitement dcast.data.table
(car reshape2::dcast
n'est pas générique et n'a pas de dcast.data.table
méthode).
reshape2::melt
d'autre part, est générique (voir methods(melt)
) et a un melt.data.table
méthode afin que vous n’ayez pas besoin de lui dire quoi que ce soit. Il saura quelle méthode vous souhaitez utiliser en fonction de la class
de dat
require(reshape2)
dcast.data.table(melt(dat, "station"), value ~ station, length)
# value 1757 2171 2812 4501 4642 5029 5480 5779 5792
# 1: ar_1d 0 0 0 0 0 0 0 0 1
# 2: ar_2d 1 0 0 0 1 1 0 2 1
# 3: lm_h_step 1 2 2 2 1 1 2 0 0
Si vous n'êtes pas pointilleux avec strictement utiliser data.table
méthodes, vous pouvez également utiliser reshape2::recast
(voir @shadows comment) qui est un wrapper pour la solution ci-dessus mais en utilisant reshape2::dcast
au lieu de dcast.data.table
et retournera donc un data.frame
objet au lieu d'un data.table
recast(dat, value ~ station, id.var = "station", length)
# value 1757 2171 2812 4501 4642 5029 5480 5779 5792
# 1 ar_1d 0 0 0 0 0 0 0 0 1
# 2 ar_2d 1 0 0 0 1 1 0 2 1
# 3 lm_h_step 1 2 2 2 1 1 2 0 0