函数或循环从 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_new98
或 zoocstack_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 中的数据更改名称,迭代多次的主要内容,如果未能解决你的问题,请参考以下文章
在循环中更改 OrderedDict 中的键名会导致 RuntimeError: OrderedDict 在迭代期间发生突变
R语言问题剖析20篇-R语言泛函式编程purrr实现优雅循环迭代