2011-07-27 234 views
1

我正在尋找在R中的數據框子集。我的語法顯然是錯誤的(即產生錯誤的結果)。過濾多個條件的數據幀

data[i,]$m_cnt <- nrow(w_data[ 
     w_data$direction >= data[i,]$min_a & 
     w_data$direction < data[i,]$max_a & 
     w_data$windspeed >= 3 & 
     w_data$windspeed < 15, 
    ])/records; 

類似的問題:Filtering a data.frame

的w_data data.frame(簡化爲簡潔起見)由風速和風向的時間序列數據。

time_stamp   windspeed direction 
2010-06-01 00:00 12.2   125 
2010-06-03 02:50 17.4   312 
2010-06-05 21:30 2.1   132 
2010-06-12 15:10 7.8   71 
2010-06-22 17:40 2.6   307 
2010-06-30 03:20 5.1   310 

上述R語句應該一定風向範圍內計數的記錄的數量,例如說>=120°<135°和一定的風速範圍內,在本例>=3m/s<15m/s。然後將計數轉換爲所採用測量總數的百分比,所以上面的例子應該等於6 = 16.66%中的1個記錄。然後百分比被記錄到另一個data.frame(數據),其結構爲:

min_a max_a l_cnt m_cnt h_cnt 
0  15  0  0  0 
15  30  0  0  0 
30  45  0  0  0 
45  60  0  0  0 
60  75  0  0.1666 0 
75  90  0  0  0 
90  105  0  0  0 
105  120  0  0  0 
120  135  0.1666 0.1666 0 
135  150  0  0  0 
150  165  0  0  0 
165  180  0  0  0 
180  195  0  0  0 
195  210  0  0  0 
210  225  0  0  0 
225  240  0  0  0 
240  255  0  0  0 
255  270  0  0  0 
270  285  0  0  0 
285  300  0  0  0 
300  315  0.1666 0.1666 0.1666 
315  330  0  0  0 
330  345  0  0  0 
345  360  0  0  0 

我遇到的問題是,所有百分比之和不等於100%(本例中的做法,但不是我運行我的腳本超過10,000條記錄)。

我也遇到過奇怪的結果,如:

data[i,]$l_cnt <- nrow(w_data[ 
           w_data$direction >= data[i,]$min_a & 
           w_data$direction < data[i,]$max_a & 
           w_data$windspeed <= 3, 
          ])/records; 

    data[i,]$m_cnt <- nrow(w_data[ 
           w_data$direction >= data[i,]$min_a & 
           w_data$direction < data[i,]$max_a & 
           w_data$windspeed <= 15, 
          ])/records; 

    data[i,]$h_cnt <- nrow(w_data[ 
           w_data$direction >= data[i,]$min_a & 
           w_data$direction < data[i,]$max_a & 
           w_data$windspeed > 15, 
          ])/records; 

主要生產的總計:

l_cnt 0,360637343 
m_cnt 0,187836625 
h_cnt 0,811938959 
total 1,360412926 

但是,如果我有資格的m_cnt計算用大於不足,即:

data[i,]$m_cnt <- nrow(w_data[ 
     w_data$direction >= data[i,]$min_a & 
     w_data$direction < data[i,]$max_a & 
     w_data$windspeed >= 3 & 
     w_data$windspeed < 15, 
    ])/records; 

我得到:

l_cnt 0 
m_cnt 0,360637343 
h_cnt 0,811938959 
total 1,172576302 
+3

'['和'$'子集的奇組合。例如'[我,「h_cnt」]'有什麼問題?什麼是錯誤的結果和預期的結果,你的數據是什麼樣的。可重複的例子? –

+0

除了Gavin提到的子集劃分之外,你的語法看起來像是有效的R.如果你在開始之前創建另一個數據集w_data_3_15 <子集(w_data,windspeed> = 3&windspeed <15)',你的代碼將更快更乾淨循環。 –

+0

@Gavin我添加了更多信息 – klonq

回答

3

大概這是從附近的你想要什麼:

> # data 
> w_data 
    windspeed direction 
1  12.2  125 
2  17.4  312 
3  2.1  132 
4  7.8  71 
5  2.6  307 
6  5.1  310 

> # grouping by cut 
> w_data <- transform(w_data, 
+      dg = cut(direction, breaks=0:24*15), 
+      wg = cut(windspeed, breaks=c(0, 3, 15, Inf))) 

> # now the data looks like: 
> w_data 
    windspeed direction  dg  wg 
1  12.2  125 (120,135] (3,15] 
2  17.4  312 (300,315] (15,Inf] 
3  2.1  132 (120,135] (0,3] 
4  7.8  71 (60,75] (3,15] 
5  2.6  307 (300,315] (0,3] 
6  5.1  310 (300,315] (3,15] 

> # tabulate and calculate the parcentage 
> table(w_data$dg, w_data$wg)/nrow(w_data) 

       (0,3] (3,15] (15,Inf] 
    (0,15] 0.0000000 0.0000000 0.0000000 
    (15,30] 0.0000000 0.0000000 0.0000000 
    (30,45] 0.0000000 0.0000000 0.0000000 
    (45,60] 0.0000000 0.0000000 0.0000000 
    (60,75] 0.0000000 0.1666667 0.0000000 
    (75,90] 0.0000000 0.0000000 0.0000000 
    (90,105] 0.0000000 0.0000000 0.0000000 
    (105,120] 0.0000000 0.0000000 0.0000000 
    (120,135] 0.1666667 0.1666667 0.0000000 
    (135,150] 0.0000000 0.0000000 0.0000000 
    (150,165] 0.0000000 0.0000000 0.0000000 
    (165,180] 0.0000000 0.0000000 0.0000000 
    (180,195] 0.0000000 0.0000000 0.0000000 
    (195,210] 0.0000000 0.0000000 0.0000000 
    (210,225] 0.0000000 0.0000000 0.0000000 
    (225,240] 0.0000000 0.0000000 0.0000000 
    (240,255] 0.0000000 0.0000000 0.0000000 
    (255,270] 0.0000000 0.0000000 0.0000000 
    (270,285] 0.0000000 0.0000000 0.0000000 
    (285,300] 0.0000000 0.0000000 0.0000000 
    (300,315] 0.1666667 0.1666667 0.1666667 
    (315,330] 0.0000000 0.0000000 0.0000000 
    (330,345] 0.0000000 0.0000000 0.0000000 
    (345,360] 0.0000000 0.0000000 0.0000000