R语言 我想根据数据集所属的列表将它们保存在不同的文件夹中

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

我有不同的数据集列表

LIST 1
mydata1<-data.frame(ID=c(1,1:4), year=rep("2010",5),Weight=c(50,50:53),Height=c(175,175:178))
mydata2<-data.frame(ID=6:10, year=rep("2011",5),Weight=c(52:56),Height=c(180:184))
mydata3<-data.frame(ID=11:15, year=rep("2012",5),Weight=c(61:65),Height=c(178:182))

mydatalist<-list(mydata1=mydata1,
     mydata2=mydata2,
     mydata3=mydata3)

LIST 2

mydata1<-data.frame(ID=c(11,11:14), year=rep("2010",5),Weight=c(60,60,51:53),Height=c(185,185,175:177))
mydata2<-data.frame(ID=16:20, year=rep("2011",5),Weight=c(62:66),Height=c(170:174))
mydata3<-data.frame(ID=21:25, year=rep("2012",5),Weight=c(63:67),Height=c(168:172))

mydatalist2<-list(mydata1=mydata1,
                 mydata2=mydata2,
                 mydata3=mydata3)

我创建了一个函数来管理每个数据集上的数据,并将干净的数据集保存在不同的文件夹中。我在函数中包含了保存功能。我知道可以在my_function之外执行保存任务。但我想尽可能地自动化我的数据管理。
因此mydatalist1的输出应存储在path 1中,mydatalist2的输出应存储在path 2中。

my_function<-function(data){
  library(tidyverse)
  data$duplicated<-duplicated(data)
  sum_duplicated<-sum(data$duplicated)
  data<-data%>%filter(duplicated==F)
  number_row<-dim(data)[1]
  data$BMI<-round(data$Weight/((data$Height/100)^2),2)
  return(list(data=data,number_row=number_row,sum_duplicated=sum_duplicated,
              save(data,file=paste0("C:/Users/MY_NAME/Dropbox/PC (2)/Desktop/OUTPUT1/",
                                    "data_",as.character(unique(data$year)),".RData"))))}




myls<-list()
myls2<-list()

#FOR LIST 1
for(i in 1:length(mydatalist)){
 myls[[i]]<- my_function(mydatalist[[i]])
 }

# FOR LIST 2
for(i in 1:length(mydatalist2)){
  myls2[[i]]<- my_function(mydatalist2[[i]])
  }

我想在我的函数中放入一些代码,如果列表是mydatalist1,则允许将输出保存在path:paste0("C:/Users/MY_NAME/Dropbox/PC (2)/Desktop/OUTPUT1/","data_",as.character(unique(data$year)),".RData")中,否则保存在path:paste0("C:/Users/MY_NAME/Dropbox/PC (2)/Desktop/OUTPUT1/", "data_",as.character(unique(data$year)),".RData")中(也就是说,列表是mydatalist2)。我认为我创建函数的方式有点复杂,因为函数中的参数是data。我不知道是否可以访问这两个列表以将其元素保存在相应的文件夹中
我只是想更改函数中的这部分代码,以便将mydatalist1的元素保存在文件夹OUTPUT1中,将mydatalist2的元素保存在OUTPUT2

return(list(data=data,number_row=number_row,sum_duplicated=sum_duplicated,
                  save(data,file=paste0("C:/Users/MY_NAME/Dropbox/PC (2)/Desktop/OUTPUT../",
                                        "data_",as.character(unique(data$year)),".RData"))))
roejwanj

roejwanj1#

我相信你是正确的,因为data参数接受的是一个 Dataframe 而不是一个列表,它不知道也不关心 Dataframe 来自哪个列表。
我认为最好的解决方案是为每个 Dataframe 添加一个标识符字段。
在为每个列表分配 Dataframe 之后,可以使用for循环来完成:

mydata1<-data.frame(ID=c(1,1:4), year=rep("2010",5),Weight=c(50,50:53),Height=c(175,175:178))
mydata2<-data.frame(ID=6:10, year=rep("2011",5),Weight=c(52:56),Height=c(180:184))
mydata3<-data.frame(ID=11:15, year=rep("2012",5),Weight=c(61:65),Height=c(178:182))

mydatalist<-list(mydata1=mydata1,
                 mydata2=mydata2,
                 mydata3=mydata3)

for (i in 1:length(mydatalist)) {
  mydatalist[[i]]$list <- 1
}

然后,你的return语句看起来像这样:

return(
    list(data = data, 
         number_row = number_row, 
         sum_duplicated = sum_duplicated,
         save(data, 
              file = paste0('OUTPUT', 
                             data$list[1], ## THIS IS WHERE IT ASSIGNS THE OUTPUT FOLDER
                             '/', 'data_', as.character(unique(data$year)), 
                             '.RData'))
        )
      )

或者,你可以改变它,使参数是列表,然后根据列表的名称将其分配给不同的文件夹。而不是使用for循环来调用列表中的每个项目的函数,你会在函数中有一个for循环来遍历列表。
还有一点如果你将library(tidyverse)命令移到函数之外,它就不必在你每次调用函数时都运行它。

相关问题