Фильтрация фрейма данных с несколькими условиями - PullRequest
1 голос
/ 27 июля 2011

Я ищу подмножество фрейма данных в 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;

Аналогичный вопрос: Фильтрация 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.Затем счетчик преобразуется в процент от общего числа выполненных измерений, поэтому приведенный выше пример должен быть равен 1 записи из 6 = 16,66%.Процент затем записывается в другой 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

1 Ответ

3 голосов
/ 27 июля 2011

вероятно, это рядом с тем, что вы хотите:

> # 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...