2017-02-09 11 views
2

긴 형식의 바람 데이터를 와이드 형식으로 변환하려고합니다. 풍속과 풍향 모두 Parameter.Name 열에 나열됩니다. 이 값은 Local.Site.Name 및 Date.Local 변수에서 모두 캐스팅해야합니다.dcast로 EPA 풍속 및 방향 데이터를 R 모양으로 바꿈

고유 한 Local.Site.Name + Date.Local 행당 여러 개의 관찰이있는 경우 해당 관측치의 평균값을 원합니다. built-in argument 'fun.aggregate = mean'은 풍속은 괜찮지 만 평균 바람 방향은 값이도 단위이기 때문에 이런 식으로 계산할 수 없습니다. 예를 들어 북쪽 (350, 10) 근처의 두 풍향의 평균은 남쪽 (180)으로 출력됩니다. 극좌표 평균이 360 또는 0 임에도 불구하고 예 : ((350 + 10)/2 = 180).

'원형'패키지를 사용하면 삼각법을 수행 할 필요없이 평균 풍향을 계산할 수 있지만 'fun.aggregate'인수 내에서이 추가 함수를 중첩 시키려고하는 데 문제가 있습니다. 나는 문이 트릭을 할 것입니다 경우 다른 간단한 생각하지만, 나는 다음과 같은 오류로 실행하고 있습니다 :

Error in vaggregate(.value = value, .group = overall, .fun = fun.aggregate, : could not find function ".fun" 
In addition: Warning messages: 
1: In if (wind$Parameter.Name == "Wind Direction - Resultant") { : 
    the condition has length > 1 and only the first element will be used 
2: In if (wind$Parameter.Name == "Wind Speed - Resultant") { : 
    the condition has length > 1 and only the first element will be used  
3: In mean.default(wind$"Wind Speed - Resultant") : 
    argument is not numeric or logical: returning NA 

목표는 바람 속도에 대한 fun.aggregate = mean하지만 바람의 방향에 대한 mean(circular(Wind Direction, units = 'degrees')을 사용할 수 있도록하는 것입니다.

가 여기에 원본 데이터의 (> 1백메가바이트) : 여기 https://drive.google.com/open?id=0By6o_bZ8CGwuUUhGdk9ONTgtT0E

데이터의 하위 집합 (1 100 행) :

library(reshape2) 
library(dplyr) 
library(circular) 

#read in the long format data: 
wind <- read.csv("<INSERT_FILE_PATH_HERE>", header = TRUE) 

#cast into wide format: 
wind.w <- dcast(wind, 
      Local.Site.Name + Date.Local ~ Parameter.Name, 
      value.var = "Arithmetic.Mean", 
      fun.aggregate = (
       if (wind$Parameter.Name == "Wind Direction - Resultant") { 
       mean(circular(wind$"Wind Direction - Resultant", units = 'degrees')) 
       } 
       else if (wind$Parameter.Name == "Wind Speed - Resultant") { 
       mean(wind$"Wind Speed - Resultant") 
       }), 
      na.rm = TRUE) 

어떤 도움 : https://drive.google.com/open?id=0By6o_bZ8CGwucVZGT0pBQlFzT2M

여기 내 스크립트입니다 대단히 감사하겠습니다!

편집을 -spacedSparking : 여기에 해결책이있다 :

library(reshape2) 
library(SDMTools) 
library(dplyr) 
#read in the EPA wind data: 
#This data is publicly accessible, and can be found here: https://aqsdr1.epa.gov/aqsweb/aqstmp/airdata/download_files.html  
wind <- read.csv("daily_WIND_2016.csv", sep = ',', header = TRUE, stringsAsFactors = FALSE) 

#convert long format wind speed data by date and site id: 
wind_speed <- dcast(wind, 
        Local.Site.Name + Date.Local ~ Parameter.Name, 
        value.var = "Arithmetic.Mean", 
        fun.aggregate = function(x) { 
         mean(x, na.rm=TRUE) 
        }, 
        subset = .(Parameter.Name == "Wind Speed - Resultant") 
) 

#convert long format wind direction data into wide format by date and local site id: 
wind_direction <- dcast(wind, 
         Local.Site.Name + Date.Local ~ Parameter.Name, 
         value.var = "Arithmetic.Mean", 
         fun.aggregate = function(x) { 
          if(length(x) > 0) 
          circular.averaging(x, deg = TRUE) 
          else 
          -1 
         }, 
         subset= .(Parameter.Name == "Wind Direction - Resultant") 
) 

#join the wide format split wind_speed and wind_direction dataframes 
wind.w <- merge(wind_speed, wind_direction) 
+0

데이터 파일의 맨 위를 처음 100 줄 정도 잘라서 여기에 게시해야합니다.귀하의 질문에 대답하고자하는 모든 사람이 106MB를 다운로드하면 도움을 줄 수 있습니다. – Richard

+0

데이터를 100 줄까지 줄 이도록했습니다. 제안을 가져 주셔서 감사합니다. – spacedSparking

+0

감사합니다. 작업하기가 훨씬 쉽지만이 작은 데이터 세트에서 해결하려는 문제가 여전히 나타나는지 확인 했습니까? 귀하의 목표는 가능한 한 귀하의 질문을 이해하고 답변 할 수있는 자원을 제공하는 것입니다. – Richard

답변

0

당신은 두 가지 기능을 적용 할 dcast의 일부를 사용하고 별도의 dataframes 그때 나는이 성가신 바람의 방향 문제를 해결하기 위해 관리 당신의 도움의 모든 그들에게

library(reshape2) 
library(dplyr) 
library(circular) 

#cast into wide format: 
wind_speed <- dcast(wind, 
       Local.Site.Name + Date.Local ~ Parameter.Name, 
       value.var = "Arithmetic.Mean", 
       fun.aggregate = function(x) { 
        mean(x, na.rm=TRUE) 
       }, 
       subset=.(Parameter.Name == "Wind Speed - Resultant") 
) 

wind_direction <- dcast(wind, 
        Local.Site.Name + Date.Local ~ Parameter.Name, 
        value.var = "Arithmetic.Mean", 
        fun.aggregate = function(x) { 
         if(length(x) > 0) 
         mean(circular(c(x), units="degrees"), na.rm=TRUE) 
         else 
         -1 
        }, 
        subset=.(Parameter.Name == "Wind Direction - Resultant") 
) 


wind.w <- merge(wind_speed, wind_direction) 
+0

이것은 긴 형식의 데이터를 서브 셋팅하는 정말 우아한 방법입니다. 즉, circular() 함수가 원하는 방향으로 바람 방향을 집계하지 않는다는 것을 깨달았습니다. 궁극적으로 평균 바람 방향을 원합니다. 사이트 및 날짜가 0도에서 360도까지의 동일한 범위 내에 있어야합니다. 대신이 문제를 해결하기 위해 openair 패키지의 일부 기능을 사용하고 싶습니다. – spacedSparking

0

당신은 wind.w를 정의하는 코드의 내부 wind.w를 사용하는 - 문제가 해결 않을거야!

또한 직선 따옴표 (') 대신 기울어 진 따옴표 (`)를 사용하고 있습니다. 직선 따옴표는 문자열을 묘사하는 데 사용해야합니다.

+0

'wind.w'문제를 지적 해 주셔서 감사합니다. 자동 완성 기능 덕분에 각도가있는 따옴표로 인해 문제가 발생합니다. 이러한 변경 작업을 수행 한 후에는 다음 오류가 표시됩니다. – spacedSparking

+0

'전체 오류 (.value = value, .group = overall, .fun = fun.aggregate, : 함수를 찾을 수 없음 ".fun" ' – spacedSparking

0

좋아 감사를 병합 할 수 있습니다. 가끔 문제를 해결하는 것은 질문 할 올바른 질문을 아는 것입니다. 제 경우에는 '벡터 평균화'라는 용어를 배우는 것이 전부였습니다! SDMTools 패키지의 circular.averaging()이라는 벡터 평균 기능이 내장되어있어 풍향을 평균화하고 여전히 0-359도 사이의 출력을 생성합니다! 내가 뭘했는지는 tjjjohnson의 스크립트를 추가하는 것이 었습니다. fun.aggregate 인수를 mean(circular(c(x), units = "degrees"), na.rm = TRUE)에서 circular.averaging(x, deg = TRUE)으로 변경했습니다. raw and aggregated 데이터의 막대 그래프는 다음과 같습니다. 모든 것이 좋게 보인다, 모두에게 감사한다!