函数或循环从 R 中的数据更改名称,迭代多次

Posted

技术标签:

【中文标题】函数或循环从 R 中的数据更改名称,迭代多次【英文标题】:Function or loop to change names from data in R, to iterate many times 【发布时间】:2022-01-17 23:57:11 【问题描述】:

我目前正在处理大量数据。数据按年份划分(从 1999 年到 2018 年),我必须每年执行几次计算(平均值,sd ...),我想创建一个函数或循环来迭代它,改变名字 这是一个示例:

zoocstack98 <- stack(zoocfiles98, varname = "zooc") #stack of layers from each 
zoocstack99 <- stack(zoocfiles99, varname = "zooc")
zoocstack00 <- stack(zoocfiles00, varname = "zooc")
#Reduce extent to the Azores region

zoocstack_new98<-crop(zoocstack98, extent(-36,-20,33,44))#longitude y luego latitude
zoocstack_new99<-crop(zoocstack99, extent(-36,-20,33,44))
zoocstack_new00<-crop(zoocstack00, extent(-36,-20,33,44))



#### 1998

index98 <- seq(as.Date('1998-01-01'), as.Date('1998-12-31'), by='day')  
corresponding to dates of environmental layers
month98<-month(index98)
zoocstack_new98new <- raster::setZ(zoocstack_new98,month98) #assign each raster layer in stack 
a timestamp by date
mean_zooc_month98 <- zApply(zoocstack_new98new, by=month98, mean, na.rm=T) #average over each 
layer in stack by day of year
sd_zooc_month98 <- zApply(zoocstack_new98new, by=month98, sd, na.rm=T) #average over each 
layer in stack by day of year


####1999
index99 <- seq(as.Date('1999-01-01'), as.Date('1999-12-31'), by='day') 
month<-month(index99)
zoocstack_new99new <- raster::setZ(zoocstack_new99,month) 
mean_zooc_month99 <- zApply(zoocstack_new99new, by=month, mean, na.rm=T) 
sd_zooc_month99 <- zApply(zoocstack_new99new, by=month, sd, na.rm=T) 

####2000
index00 <- seq(as.Date('2000-01-01'), as.Date('2000-12-31'), by='day') 
month<-month(index00)
zoocstack_new00new <- raster::setZ(zoocstack_new00,month) 
mean_zooc_month00 <- zApply(zoocstack_new00new, by=month, mean, na.rm=T) 
sd_zooc_month00 <- zApply(zoocstack_new00new, by=month, sd, na.rm=T) 

我想找到一种自动执行此操作的方法,而不是复制和替换名称,这导致我犯了很多错误。

提前致谢

【问题讨论】:

考虑使用 list 的 data.frames 而不是多个单个数据帧。在list 中命名一个对象非常简单。 你能再详细一点吗?我是初学者用户 也许我误解了你的问题:数据是如何提供的?您是否已经有多个 data.frames 或者您是否有许多名为(例如)zoocstack_new98zoocstack_new99 的文件? 是的,抱歉,我看到我的标题有点混乱。经过一些操作后,我还获得了执行重复操作的数据帧,所以总的来说,我只是在寻找一种自动完成操作的方法 【参考方案1】:

如果您不知道如何编写循环,您可能应该(再次)阅读一些关于循环、函数和 lapply 的 R 文本介绍。

我会编写一个处理一年的函数。我假设您使用list.files 获取文件一年,基于文件名中的年份;但您可能需要调整该行以使其适合您。如果这不起作用,您可以改为将两个参数传递给函数(文件名和年份)

f <- function(year) 
    zfiles <- list.files(".", pattern=year)
    zoo <- stack(zfiles, varname = "zooc")
    zoo <- crop(zoo, extent(-36,-20,33,44))
    index <- seq(as.Date(paste0(year, '-01-01')), as.Date(past0(year, '-12-31')), by='day')  
    month <- month(index)
    zoo <- raster::setZ(zoo, month) 
    zApply(zoo, by=month, mean, na.rm=T)

现在调用该函数一年:

mean98 <- f(1998)

或者在几年的范围内

x <- lapply(1998:2000)

【讨论】:

感谢您的回答!我目前正在查看手册如何执行我打算执行的操作,但如果有人向您解释它总是更容易和更快。 大部分内容我都懂,但“list.files”无法正常工作

以上是关于函数或循环从 R 中的数据更改名称,迭代多次的主要内容,如果未能解决你的问题,请参考以下文章

如何使用R中的下一个函数跳过for循环中的迭代[重复]

在循环中更改 OrderedDict 中的键名会导致 RuntimeError: OrderedDict 在迭代期间发生突变

R语言问题剖析20篇-R语言泛函式编程purrr实现优雅循环迭代

R语言问题剖析20篇-R语言泛函式编程purrr实现优雅循环迭代

对于 R 中的大迭代,foreach 循环变得不活动

如何在R中的循环中运行(更改)JavaScript文件?