/ / tabelaryczne wiersze w data.table - r, data.table

tabulacja wierszowa w data.table - r, data.table

Posiadanie tabeli danych w następujący sposób:

   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

Chciałbym zestawić częstotliwość metod na stację.
Tak więc oczekiwany wynik byłby

          1757  2171  2812 ...
lm_h_step    1     2     2
ar_2d        1     0     0
ar_1d        0     0     0 ...

Co próbowałem dotychczas:

apply(dat,1,table)

daje właściwy wynik, ale nie jest odpowiednio sformowany.

Jakieś pomysły?

Ilość danych:

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))

Odpowiedzi:

5 dla odpowiedzi № 1

Próbować dcast/melt połączenie

Dla data.table v> = 1.9.5 Użyj tego

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

Dla data.table v <1.9.5 musisz także załadować reshape2 i wyraźnie użyć dcast.data.table (bo reshape2::dcast nie jest ogólny i nie ma dcast.data.table metoda).

reshape2::meltz drugiej strony jest rodzajowy (patrz methods(melt)) i ma melt.data.table , więc nie musisz nic o tym mówić. Będzie wiedział, której metody chcesz użyć w zależności od class z 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

Jeśli nie jesteś wybredny przy ścisłym użyciu data.table metody, których możesz także użyć reshape2::recast (patrz komentarz @shadows), który jest opakowaniem dla powyższego rozwiązania, ale używa reshape2::dcast zamiast dcast.data.table i w ten sposób zwróci a data.frame obiekt zamiast 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