2011-07-27 240 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