R 在数据帧子集上重叠而不进一步拆分
我不知道如何做到这一点,而不涉及每一个单独的部分。我有一个初始的timeseries数据集,我将其拆分为一个包含12个数据帧的列表,代表每个月。在每个月内,我希望在每个独特的站点上运行计算和ggplot,而不必调用每个单独的站点。目前的结构如下:R 在数据帧子集上重叠而不进一步拆分,r,list,dataframe,lapply,R,List,Dataframe,Lapply,我不知道如何做到这一点,而不涉及每一个单独的部分。我有一个初始的timeseries数据集,我将其拆分为一个包含12个数据帧的列表,代表每个月。在每个月内,我希望在每个独特的站点上运行计算和ggplot,而不必调用每个单独的站点。目前的结构如下: $ April :'data.frame': 9360 obs. of 15 variables: ..$ site_id : int [1:9360] 1003 1003 1003 1003 1003 1003 1003 10
$ 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 ...
如果我将标准化rmse完全应用于每个数据帧,我可以使用Lappy计算标准化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")
stdres.fun我们可以修改函数并使用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))
库(purrr)
图书馆(dplyr)
monthSplit2%
分组依据(站点)%>%
突变(stdSWE_res=swe_res_mm/)和(swe_res_mm^2,
na.rm=TRUE)/n())^.5)
这是一种情况,如果一个可重复的示例会起到很大作用,您能否共享数据的dput()
或dput(head())
的输出?我尝试过,但输出对于控制台窗口来说太长,因此它会被切断。还有别的方法吗?我查阅了有关mutate的文档,但还是不太明白。你能解释一下它在上面的实际作用吗?正如在上面使用mutate与直接计算stdSWE_res之间有什么区别一样?@user3427325除了这里的NROW
被n()
行数替换外,没有太大区别,这在分组与不分组时会有所不同。我不知道为什么,但我一直得到一个:错误:找不到对象“stdSWE\u res”。我知道该列尚未创建,但我假设该列会根据计算结果自行创建?@user3427325抱歉,这是我从您的逻辑复制代码的错误。在=
的右侧,它既是swe_Res_mm
。更新了代码