【问题标题】:How to implement several same functions on several data frames and retrieve the output to several data frames如何在多个数据帧上实现多个相同的功能并将输出检索到多个数据帧
【发布时间】:2020-11-14 23:23:24
【问题描述】:

我有 16047 个 csv 文件,我使用 tor() 函数将它们加载到 R 中的全局环境中。所以现在我有 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

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

有没有一种方法可以像我们通常在其他编程语言中所做的那样用 R 编写,比如 for 循环,并像 [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)
  }) 

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

谢谢

【问题讨论】:

  • 假设st[[i]] 是一个错字,而您实际上有lst[[i]]。然后最终的l 对象将包含所有的data.frames。您可以使用l[[1]]l[[2]]l[[3] 等来访问它们(从列表中提取时请注意双括号)。将所有数据放在一个列表中可以更轻松地使用,而不是在全局环境中创建数千个变量。

标签: r function loops dataframe csv


【解决方案1】:

您可以使用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)

【讨论】:

  • 嗨@Ronak Shah 感谢您的帮助。在使用代码时,我发现我的文件中缺少一些 LR 值。因此,当我编写代码 list_df
  • @Ashi 是的,如果不是所有值都存在,你可以这样做list_df &lt;- mget(ls(pattern = 'LR\\d+'))
  • 谢谢。有效。既然你说我可以使用其他功能进行分离。我在运行 tidyr::separate(x, V1, c(....)) 行时遇到错误,因为在使用 tor() 函数将 csv 加载到我的全局环境中时,标题被视为我的第一行数据集。我已经编辑了帖子并在那里显示了我的数据的样子,还有其他方法可以做到这一点。
  • @Ashi 请不要改变这个问题。如果您需要帮助改进当前代码或任何其他请求,请考虑提出一个新问题。每个问题应该只解决一个特定问题,而不是多个问题。
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2021-12-11
相关资源
最近更新 更多