2011-07-27 5 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 문

이 예 >=3m/s<15m/s에서 인스턴스 >=120°<135°과 소정 풍속 범위라고 특정 풍향 범위 레코드 수를 카운트하는데있다. 카운트는 측정 된 총 측정 횟수의 백분율로 변환되므로 위의 예는 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 

I가 발생하고 문제가 모든 비율의 합 (이 예는 않지만, 같지 100 % 없다는 것이다 I 기록을 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

이상한 혼합. '[i, "h_cnt"]'의 어떤 점이 잘못 되었습니까? 잘못된 결과와 예상되는 결과는 무엇이며 데이터는 어떻게 생겼을까요? 재현 가능한 예? –

+0

개빈 (Gavin)이 언급 한 부분 집합 외에도 구문은 유효한 R과 비슷합니다. 시작하기 전에 다른 데이터 집합 'w_data_3_15 <- subset (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 
관련 문제