/ / dotwise सारणी डेटाटेबल में - आर, डेटा.table

data.table में पंक्तिबद्ध सारणीकरण - आर, डेटा.table

निम्नानुसार एक डेटा.table है:

   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

मैं प्रति स्टेशन विधियों की आवृत्ति को सारणीबद्ध करना चाहता हूं।
तो अपेक्षित परिणाम होगा

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

मैंने अभी तक क्या प्रयास किया है:

apply(dat,1,table)

सही परिणाम का उत्पादन कर रहा है, लेकिन यह उचित रूप से तैयार नहीं है।

कोई विचार?

डेटा का डंप:

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

उत्तर:

जवाब के लिए 5 № 1

प्रयत्न dcast/melt मेल

के लिये data.table v> = 1.9.5 इसे इस्तेमाल करो

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

के लिये data.table वी <1.9.5 आपको लोड करने की भी आवश्यकता होगी reshape2 और स्पष्ट रूप से उपयोग करें dcast.data.table (इसलिये reshape2::dcast सामान्य नहीं है और एक नहीं है dcast.data.table तरीका)।

reshape2::meltदूसरी तरफ, सामान्य है (देखें methods(melt)) और एक है melt.data.table विधि इसलिए आपको इसे कुछ भी बताने की आवश्यकता नहीं है। यह पता चलेगा कि आप किस विधि का उपयोग करना चाहते हैं class का 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

यदि आप कड़ाई से उपयोग करने के साथ picky नहीं हैं data.table विधियों, आप भी उपयोग कर सकते हैं reshape2::recast (@shadows टिप्पणी देखें) जो उपर्युक्त समाधान के लिए एक रैपर है लेकिन इसका उपयोग कर रहा है reshape2::dcast के बजाय dcast.data.table और इस प्रकार एक वापस आ जाएगा data.frame एक के बजाय वस्तु 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