首页 > 解决方案 > 如何在多个数据帧上实现多个相同的功能并将输出检索到多个数据帧

问题描述

我使用 tor() 函数在 R 的全局环境中加载了 16047 个 csv 文件。所以现在我有 16047 个数据帧(命名为 LR1、LR2、....LR16047),每个数据帧有两列。现在我想对所有数据框做一些工作。

我的数据框如下所示:

 V1                                           V2
 
 suff_extn_AACCATTGGCTTTGTGCCATCGGCGGAAGTG_0  T
 suff_extn_AAAGGTCGCCACCATTTCCGGCAGCGATGCT_0  AAAACCTGGCTGCTGGCTCAGGCCGATTTTC

这是我想应用于所有数据帧的代码。

 pref_LR1 <- LR1 %>% separate(V1, c("Column1", "Column2", "MacroNode", "Column4"))
 pref_LR1$Column1 <- NULL
 pref_LR1$Column2 <- NULL
 pref_LR1$Column4 <- NULL

所以我为每个现有的数据框创建新的数据框并分离第一列,然后删除其中的三列。

有没有一种方法可以像我们通常在其他编程语言(如 for 循环)中那样用 R 编写,并像 [i] 一样访问它们以获取第 i 个数据帧。

我试图做一些在 R 中对多个文件应用相同功能时提到的事情

像这样

# Create vector of file names in working direcotry
  files <- list.files() 
  files <- files[grep("csv", files)]  

#create empty list
 lst <- vector("list", length(files))

#Read files in to list
 for(i in 1:length(files)) {
   st[[i]] <- read.csv(files[i])
 }

#Apply a function to the list
  l <- lapply(lst, function(x) {
   //the work of the function
   return(x)
  }) 

但这并没有像我想要的那样给我单独的数据框。

谢谢

标签: rfunctionloopsdataframecsv

解决方案


您可以使用创建数据框的名称paste0并使用mget将它们放入列表中。

list_df <- mget(paste0('LR', 1:16047))

当它们在列表中时,对多个数据帧进行操作会更容易。然后,您可以将您的函数应用到每个数据框lapply。我认为separate可以使用一些正则表达式来简化您的调用,而不是创建 4 列然后删除其中的 3 列,但是由于我们不知道您的数据看起来如何,所以我不会修改它。

new_df <- lapply(list_df, function(x) {
     x1 <- tidyr::separate(x, V1, c("Column1", "Column2", "MacroNode", "Column4"))
     x1$Column1 <- NULL
     x1$Column2 <- NULL
     x1$Column4 <- NULL
     x1
   })

new_df如果您希望更改反映在您可以使用的原始数据框中,这将为您提供数据框列表list2env

list2env(new_df, .GlobalEnv)

推荐阅读