/ / tabulation par rangée dans data.table - r, data.table

tabulation par rangée dans data.table - r, data.table

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 № 1

Essayer 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::meltd'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