微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以 R

如何解决以 R

我有以下问题:

为了分析天气对公民科学网页观察自然(动物、植物等)的志愿者的影响,我需要将每日观察结果与最近气象站的天气信息相匹配。我正在使用 rdwd(用于德国气象服务的数据)并且已经设法将每个观测位置与最近的气象站结合起来。所以我现在有一个像这样有 100 行的数据框 (my_df_example):

     ID      Date         lat     long      Station_id                   Stationname
   1317186439 2019-05-03 47.77411 9.540569        4094     Weingarten,Kr. Ravensburg
   -2117439060 2019-05-19 48.87217 9.396229       10510             Winterbach/Remstal
   -630183789 2019-04-30 48.86810 9.285427        4928      Stuttgart (Schnarrenberg)
   -390672435 2019-05-10 50.71187 8.706279        1639             Giessen/Wettenberg
   262182713 2019-05-01 50.82548 8.892961        3164 Coelbe,Kr. Marburg-Biedenkopf
   -373270631 2019-05-24 51.61666 7.950153        5480                           Werl

使用 dput(my_df_example):

   structure(list(ID = c(1317186439L,-2117439060L,-630183789L,-390672435L,262182713L,-373270631L,...
   Datum = structure(c(1556841600,1558224000,1556582400,1557446400,1556668800,1558656000,1557532800,...,class = c("POSIXct","POSIXt"),tzone = "UTC"),lat = c(47.7741093721703,48.8721672952686,48.8681024146134,50.7118683229165,50.8254843786222,51.6166575725419,48.7357007677785,...
   long = c(9.54056899481679,9.3962287902832,9.28542673587799,8.70627880096436,8.89296054840088,7.95015335083008,11.3105964660645,... 
   Stations_id = c(4094L,10510L,4928L,1639L,3164L,5480L,3484L,... 
   Stationsname = c("Weingarten,Kr. Ravensburg","Winterbach/Remstal","Stuttgart (Schnarrenberg)","Giessen/Wettenberg","Coelbe,Kr. Marburg-Biedenkopf","Werl",... 
   row.names = c("58501","89910","69539","24379","45331","77191","50028",class = "data.frame")

我现在需要做的是获取每个站点在特定日期的天气信息。我正在尝试使用 R 中的 rdwd 包来做到这一点。 到目前为止,我尝试了两种选择,但都没有奏效。

选项 1:

    urls <- selectDWD(name=my_df_final$Stationsname,res="daily",var="kl",per="historical",outvec=TRUE)
    kl <- dataDWD(urls[1:100])

这给了我一个包含 100 个列表的列表。 100 个列表中的每个列表都包含某个站点每个记录日的天气数据。所以我需要从这些列表中过滤数据,以便日期与 my_df_example 中的日期匹配。我不知道如何从列表中的列表中提取信息。

选项 2:

   stat <- my_df_example$Stationname
   link <- selectDWD(c(stat),per="hist") 
  file <- dataDWD(link,read=FALSE)
  clim <- readDWD(file,varnames=TRUE)

这里的问题是,dataDWD 不适用于列表。由于“链接”包含多个站名,因此它不仅仅是一个向量。

我真的不知道这些选项中的一个是否是正确的方法,或者替代方案是否更有意义。

感谢您提供的任何建议。

解决方法

根据您的问题:

我现在需要做的是获取特定日期每个站点的天气信息。

然后,一旦您拥有列表列表 (kl),您就可以从这个“元”列表中提取您正在寻找的信息的子集:

query <- lapply(kl,function(x) {
  x[which((as.Date(x$MESS_DATUM) %in% as.Date(my_final_df$Date)) &
           (x$STATIONS_ID %in% my_final_df$Station_id)),]
})

x 表示传递给函数定义的对象 kl%in% 运算符,如其字母所示,将查找 $MESS_DATUM$Date 变量和 (&) 之间共同的元素 in 还查找 { {1}} 和 STATIONS_IDStation_id 确保在对数据进行子集化时不会发生逻辑上的意外,并且 which() 为两个数据框返回一个共同的日期格式。

执行提取后,您必须将信息折叠成单个数据框。由于元列表中所有列表中的所有列都相同,因此您可以直接使用 as.Date() + do.call()。喜欢:

rbind()

为避免混乱的行名,请调用:

query <- do.call(rbind,query)

然后,要查看查询数据集中的站名,将查询与 my_final_df 合并:

rownames(query) <- NULL

最终结果如下:

colnames(query)[1] <- "Station_id" # the key needs to have the samen name in both data frames
query <- merge(query,my_final_df,by = "Station_id",all = TRUE)

此数据集与您最初在 Station_id MESS_DATUM QN_3 FX FM QN_4 RSK RSKF SDK SHK_TAG NM VPM PM TMK UPM TXK TNK TGK eor ID Date 2 1639 2019-05-01 10 7.1 2.0 3 0.0 0 11.383 NA 0.3 9.0 991.15 12.6 65.67 20.6 3.3 -0.4 eor -390672435 2019-05-10 7 3164 2019-04-30 NA NA NA 3 0.0 0 NA 0 NA 8.9 NA 12.3 64.92 18.7 5.4 3.4 eor 262182713 2019-05-01 16 4094 2019-05-10 10 10.3 3.4 3 5.7 4 5.933 NA NA 10.4 NA 11.9 76.04 16.8 8.5 6.8 eor 1317186439 2019-05-03 21 4928 2019-05-03 10 10.0 3.2 3 0.4 6 3.183 NA 7.5 9.0 973.66 10.4 72.38 14.2 7.8 7.3 eor -630183789 2019-04-30 29 5480 2019-05-19 10 11.0 1.8 3 1.0 6 5.000 NA 7.2 13.0 995.10 14.0 82.38 21.8 6.8 5.2 eor -373270631 2019-05-24 36 10510 2019-05-24 10 5.9 1.4 NA NA NA NA NA NA NA NA NA NA NA NA NA eor -2117439060 2019-05-19 lat long Stationname 2 50.71187 8.706279 Giessen/Wettenberg 7 50.82548 8.892961 Coelbe,Kr. Marburg-Biedenkopf 16 47.77411 9.540569 Weingarten,Kr. Ravensburg 21 48.86810 9.285427 Stuttgart (Schnarrenberg) 29 51.61666 7.950153 Werl 36 48.87217 9.396229 Winterbach/Remstal 中提供的日期、车站 ID 和名称相匹配。

如果有更多的时间,也许有人会告诉我们如何用 my_df_example 表示法解决这个问题,因为我怀疑用这个包进行子集提取算法会更直接。

,

我建议采用 data.table 解决方案:

library(data.table)

full = rbindlist(kl) # Convert list to one huge DF
setDT(my_df_final) # Convert your df to DT

new_df <- merge(my_df_final,full,by.x = c("ID","Datum"),by.y = c("STATIONS_ID","MESS_DATUM"),all.x = T) # Merge full and your df

new_df
      ID      Datum      lat     long Stations_id                   Stationsname QN_3   FX  FM QN_4 RSK RSKF   SDK
1:  1639 2019-05-10 50.71187 8.706279        1639             Giessen/Wettenberg   10  9.1 3.3    3 9.3    6 4.000
2:  3164 2019-05-01 50.82548 8.892961        3164 Coelbe,Kr. Marburg-Biedenkopf   NA   NA  NA    3 0.0    0    NA
3:  4094 2019-05-03 47.77411 9.540569        4094     Weingarten,Kr. Ravensburg   10  6.4 2.2    3 5.2    4 0.000
4:  4928 2019-04-30 48.86810 9.285427        4928      Stuttgart (Schnarrenberg)   10  7.9 2.7    3 0.0    6 3.583
5: 10510 2019-05-19 48.87217 9.396229       10510             Winterbach/Remstal   10 11.3 1.8   NA  NA   NA    NA
   SHK_TAG  NM  VPM     PM  TMK   UPM  TXK TNK TGK eor
1:      NA 6.6 10.2 985.16 11.1 78.21 15.9 7.7 5.9 eor
2:      NA  NA  9.7     NA 12.3 71.00 20.0 3.2 1.4 eor
3:      NA  NA 10.0     NA  8.7 88.92 11.6 5.3 3.0 eor
4:       0 4.9  9.3 981.55 10.5 75.58 15.3 7.3 3.7 eor
5:      NA  NA   NA     NA   NA    NA   NA  NA  NA eor

(也应该在基础 R 中工作,但这种方式肯定更快)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。