【问题标题】:Lapply over subset of dataframes without splitting further覆盖数据帧的子集而不进一步拆分
【发布时间】:2020-07-07 18:57:59
【问题描述】:

如果不解决每个单独的部分,我不知道如何做到这一点。我有一个初始时间序列数据集,我将其拆分为代表每个月的 12 个数据帧的列表。在每个月内,我想在每个唯一站点上运行计算和 ggplot,而不必调用每个单独的站点。目前的结构如下:

 $ April    :'data.frame':  9360 obs. of  15 variables:
  ..$ site_id     : int [1:9360] 1003 1003 1003 1003 1003 1003 1003 1003 1003 1003 ...
  ..$ UTC_date.1  : Date[1:9360], format: "2005-04-01" "2005-04-02" "2005-04-03" "2005-04-04" ...
  ..$ POSIXct     : POSIXct[1:9360], format: "2005-04-01 06:00:00" "2005-04-02 06:00:00" "2005-04-03 06:00:00" "2005-04-04 06:00:00" ...
  ..$ swe_mm      : num [1:9360] 45.9 44.6 43.5 42.4 41.2 ...
  ..$ fsca        : num [1:9360] 1 1 1 1 0.997 ...
  ..$ snoht_m     : num [1:9360] 0.303 0.239 0.21 0.186 0.165 ...
  ..$ swe_mm.1    : num [1:9360] 45.9 44.6 43.5 42.4 41.2 ...
  ..$ fsca.1      : num [1:9360] 1 1 1 1 0.997 ...
  ..$ snoht_m.1   : num [1:9360] 0.303 0.239 0.21 0.186 0.165 ...
  ..$ actSWE_mm   : num [1:9360] 279 282 282 282 282 284 292 295 295 295 ...
  ..$ actSD_cm    : num [1:9360] 79 79 NA 79 79 81 185 81 81 81 ...
  ..$ swe_Res_mm  : num [1:9360] 233 237 238 240 241 ...
  ..$ snoht_Res_m : num [1:9360] 0.487 0.551 NA 0.604 0.625 ...
  ..$ swe_Res1_mm : num [1:9360] 233 237 238 240 241 ...
  ..$ snoht_Res1_m: num [1:9360] 0.487 0.551 NA 0.604 0.625 ...

如果我将它完全应用于每个数据帧,我可以使用 lapply 毫无问题地计算标准化 rmse:

stdres.fun <- function(data,x,out) {data[out] <- data[[x]] / ((sum(data[[x]]^2, na.rm = TRUE)/NROW(data))^.5); data}
monthSplit <- lapply(monthSplit, stdres.fun, x = "swe_Res_mm", out="stdSWE_res")

但是,我无法弄清楚如何对每个唯一的 site_id 运行此计算。我的意思是有 32 个不同的站点。它们是每个数据框中的相同站点,但是我想计算列表中每个数据框中每个站点的 rmse。因此,如果我有站点 946 和 1003,则计算将分别在每个站点上运行,而不是一起运行。

我假设我可以将数据进一步拆分到不同的列表中,但我觉得这会比现在更混乱。我还有其他方法可以做到这一点吗?

【问题讨论】:

  • 这是一个案例,如果一个可重复的例子会有很长的路要走,你能分享你的数据的dput()dput(head()) 的输出吗?
  • 我试过了,但是输出对于控制台窗口来说太长了,所以它会被切断。还有其他方法吗?

标签: r list dataframe lapply


【解决方案1】:

我们可以修改函数并使用tidyverse方法

library(purrr)
library(dplyr)
monthSplit2 <- map(monthSplit, ~ 
             .x %>%
                group_by(sites) %>%
                mutate(stdSWE_res = swe_Res_mm/((sum(swe_Res_mm^2, 
                na.rm = TRUE)/n()) ^.5))

【讨论】:

  • 我翻阅了 mutate 的文档,但还是不太明白。你能解释一下它在上面的实际作用吗?使用上面的 mutate 与直接计算 stdSWE_res 有什么区别?
  • @user3427325 没有太大区别,只是这里的NROWn() 替换为分组与不分组时不同的行数
  • 我不知道为什么,但我不断收到:错误:找不到对象'stdSWE_res'。我知道该列尚未创建,但我假设该列会根据计算自行创建?
  • @user3427325 抱歉,这是我从您的逻辑中复制代码的错误。在= 的右侧,都是swe_Res_mm。更新了代码
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2020-05-14
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2014-12-02
相关资源
最近更新 更多