首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保留站点id

如何保留站点id
EN

Stack Overflow用户
提问于 2020-06-24 06:10:59
回答 1查看 45关注 0票数 0

我有一个包含id、纬度、经度列的数据框。我需要找到附近的气象站,并使用RNOAA下载数据。第一步是使用meteo_nearby_stations获取站点名称,然后使用meteo_pull_monitors下载数据。

我的问题是,如何在meteo_pull_monitors的结果中保留来自df的站点id?

desired result can be seen here

代码语言:javascript
复制
library(rnoaa)
id<-c("07227500", "07308500", "07311700")
latitude<-c(35.47033,34.11009,  33.82064)
longitude<-c(101.87963,98.53172,-99.78648)
df<-data.frame(id,latitude,longitude)

met_test<-meteo_nearby_stations(df, lat_colname = "latitude",
      lon_colname = "longitude", station_data = ghcnd_stations(),
      var = c("TMAX","TMIN"), year_min = NULL, year_max = NULL, 
      radius = 200, limit = 3)
met_test_df<-do.call(rbind, lapply(met_test,as.data.frame))
met_id<-as.vector(met_test_df$id)
met_data<-meteo_pull_monitors(met_id, var = c("date","TMAX","TMIN"), date_min = "2020-01-01", date_max = "2020-06-01")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-24 06:29:16

我们可以通过提取met_test列表中每个元素的名称,将site_id数据连接到meteo_nearby_stations()函数的结果中。

代码语言:javascript
复制
library(rnoaa)
id<-c("07227500", "07308500", "07311700")
latitude<-c(35.47033,34.11009,  33.82064)
longitude<-c(101.87963,98.53172,-99.78648)
df<-data.frame(id,latitude,longitude)

met_test<-meteo_nearby_stations(df, lat_colname = "latitude",
                                lon_colname = "longitude", station_data = ghcnd_stations(),
                                var = c("TMAX","TMIN"), year_min = NULL, year_max = NULL, 
                                radius = 200, limit = 3)

幸运的是,met_list的每个元素都包含与meter_nearby_stations()请求相关联的site_id的名称。我们可以使用names()函数访问此信息。

代码语言:javascript
复制
> names(met_test)
[1] "07227500" "07308500" "07311700"
> 

为了合并站点标识符,我们修改了原始post中的do.call()函数,使lapply()包含一个匿名函数,该函数将列表中的正确名称分配给我们命名为site_id的列。请注意,为了遍历数据帧列表并访问它们的名称,我们使用一个向量1:length(met_test)来驱动lapply()函数,并将met_test作为第二个参数包含进来,这样我们就可以使用索引号x来访问正确的列表元素及其名称。

代码语言:javascript
复制
met_test_df<-do.call(rbind, lapply(1:length(met_test),function(x,y){
     data <- as.data.frame(y[[x]])
     # note individual data frames already have an ID variable
     data$site_id <- names(y)[x]
     data
},met_test))
met_test_df

对输出执行...and操作:

代码语言:javascript
复制
> met_test_df
           id             name latitude longitude   distance  site_id
1 CHM00052955           GUINAN  35.5830  100.7500 102.990626 07227500
2 CHM00056080            HEZUO  35.0000  102.9000 106.410602 07227500
3 CHM00052957           TONGDE  35.2700  100.6500 113.695195 07227500
4 CHM00056033            MADOI  34.9170   98.2170  94.243943 07308500
5 CHM00056046           DARLAG  33.7500   99.6500 110.669503 07308500
6 CHM00056029            YUSHU  33.0000   96.9670 190.415441 07308500
7 USC00419163     TRUSCOTT 3 W  33.7569  -99.8617   9.927467 07311700
8 USC00411995 COPPER BREAKS SP  34.1122  -99.7430  32.667020 07311700
9 USC00417572        RHINELAND  33.5333  -99.6500  34.356103 07311700
> 

此时,我们可以提取各个监视器数据,并根据监视器id合并site_id编号。首先,我们提取监控数据。

代码语言:javascript
复制
met_id<-as.vector(met_test_df$id)
met_data<-meteo_pull_monitors(met_id, var = c("date","TMAX","TMIN"), date_min = "2020-01-01", date_max = "2020-06-01")

然后,我们合并站点标识符数据。

代码语言:javascript
复制
sites <- met_test_df[,c("id","site_id")]
mergedData <- merge(met_data,sites)

最后,我们打印结果数据框的前几行。

代码语言:javascript
复制
head(mergedData)

           id       date tmax tmin  site_id
1 CHM00052955 2020-01-01   81 -193 07227500
2 CHM00052955 2020-01-02   81 -163 07227500
3 CHM00052955 2020-01-03   54 -155 07227500
4 CHM00052955 2020-01-04   62 -127 07227500
5 CHM00052955 2020-01-05   62 -149 07227500
6 CHM00052955 2020-01-06    3 -216 07227500
> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62544511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档