R语言 如何编写一个函数为每个数据框创建新的列表对象?

but5z9lq  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(107)

我有几个遥测对象,其中包含按年份过滤的动物跟踪数据。我还创建了一个包含所有这些遥测对象的列表。我目前有一个循环函数,可以计算并绘制给定遥测对象中每个个体的变异函数。我现在想做的是把我的变差函数循环变成一个函数,我可以应用到遥测对象的列表,它将计算变差函数并创建新的列表我的每个遥测对象的对象。
下面是一个使用ctmm包中的跟踪数据的最小工作示例:

library(ctmm) 
library(ggplot2) 
library(dplyr) 
library(stringr) 
library(lubridate) 
library(sf) 
library(tidyverse) 
library(sp) 
library(scales) 
library(tidyr) 
library(tibble)

data("buffalo")

Cilla <- as.data.frame(buffalo$Cilla) 
Cilla$id<-"Cilla"

Gabs<-as.data.frame(buffalo$Gabs)
Gabs$id<-"Gabs"

Mvubu<-as.data.frame(buffalo$Mvubu)
Mvubu$id<-"Mvubu"

Pepper<-as.data.frame(buffalo$Pepper)
Pepper$id<-"Pepper"

Queen<-as.data.frame(buffalo$Queen)
Queen$id<-"Queen"

Toni<-as.data.frame(buffalo$Toni)
Toni$id<-"Toni"

buffalo2 <- rbind(Cilla,Gabs,Mvubu,Pepper,Queen,Toni)
buffalo2$Year<-year(buffalo2$timestamp)
buffalo2$Year<-as.factor(buffalo2$Year)
buffalo2$UTM.zone<-"12 +datum=NAD27"
buffalo2$timestamp <- ymd_hms(buffalo2$timestamp) 
buffalo2$Timestamp<-buffalo2$timestamp
buffalo2 <- separate(buffalo2, timestamp, c("date","time"), sep= " ", 
remove= TRUE, extra= "merge")

buffalo2 <- buffalo2[, c(8,9,1,2,6,7,11,10)]

data2005<-buffalo2 %>% 
  filter(Year==2005)
data2006<-buffalo2 %>% 
  filter(Year==2006)

Tdata2005<-as.telemetry(data2005, timeformat="auto",timezone="UTC", 
timeout=Inf,datum="NAD27",
         na.rm="row",mark.rm=FALSE,keep=FALSE,drop=FALSE)
Tdata2006<-as.telemetry(data2006, timeformat="auto",timezone="UTC", 
timeout=Inf,datum="NAD27",
                    na.rm="row",mark.rm=FALSE,keep=FALSE,drop=FALSE)

Tdata<-list(Tdata2005,Tdata2006)
names(Tdata)<-c("Tdata2005","Tdata2006")

#Variogram loop
SVF <- function(x, date) {
  SVF <- list()
  for (i in 1:length(x)) {    
    SVF[[i]] <- variogram(x[[i]])
    plot(SVF[[i]], main = paste(names(x[i]), "(", date, ")"))
  }
}

#Applying the variogram function to the list of dataframes with dates
Years<-c("2005","2006")
lapply(seq_along(Tdata), function(i) SVF(Tdata[[i]], Years[i]))

到目前为止,我的函数能够计算和绘制Tdata列表中两个遥测对象(Tdata 2005和Tdata 2006)中个体的变差图。接下来我想做的是找出一种方法,将每个年度遥测对象的变差图保存为列表,最好是每年单独的列表(例如:Variogramms_Tdata2005和Variogramms_Tdata2006)。有没有任何方法可以让我编辑我的代码来使这个工作?谢谢!

30byixjq

30byixjq1#

根据我的理解,你可以调整函数来计算(仅)变异函数,然后为列表中的每个元素(对应于一年)导出包含不同变异函数的列表,如下所示:

SVF_save <- function(x) {
  SVF <- list()
  for (i in 1:length(x)) {    
    SVF[[i]] <- variogram(x[[i]])
  }
  return(SVF)
}

svf_for_save <- lapply(seq_along(Tdata), function(i) SVF_save(Tdata[[i]]))

Years<-c("2005","2006")

### saving as .rds object
for (i in 1:length(svf_for_save)) {    
  saveRDS(object = svf_for_save[[i]], file = paste0("Variograms_Tdata",Years[i],".rds"))
}

相关问题