【问题标题】:Organizing the files under the group name在组名下组织文件
【发布时间】:2021-03-19 01:14:16
【问题描述】:

我的数据看起来像一个列表:

G085_1.csv, G085_2.csv, G085_3.csv, .. G100_1.csv, G100_2.csv, .. G173_1, csv., G173_2, csv., G173_3.csv

其中 G 代表组,后面是每个组成员(1、2 或 3)的标识。值得注意的是,有些组并没有全部三个成员。

我要做的是创建一个循环来为整个组运行以下代码(1 个组的示例)。

i1 <- fread("sample/G085_1.csv")
i2 <- fread("sample/G085_2.csv")
i3 <- fread("sample/G085_3.csv")

我一直在做的是:

Groups <- c()
for(g in 85:173){
  Groups[g] <- ifelse(g<100,
                      paste0("G0", g),
                      paste0("G", g))
}

Members <- c("i1", "i2", "i3")
for(g in 1:length(Groups)){
  for(m in 1:3) {
    filename<- paste0("i",m)
    wd <- paste0("sample/", Groups[g],"_",
                 m, ".csv")
    ifelse(file.exists(wd),assign(filename,fread(wd)),
           function(){})
  }
   assign(Groups[g],...
         )
}

我被困的地方是最后一部分 (assign(Groups[g]...)。我不确定什么可以调用所有 i1、i2 ,组下每个组的i3个数据框。有没有比这里使用assign函数更好的方法?

【问题讨论】:

  • 因此,对于每个组(G085G086 等),您希望 assign i1i2i3(以存在者为准)。在那之后你想做什么?顺便说一句,您应该将数据存储在列表中,而不是使用assign

标签: r dplyr


【解决方案1】:

此代码不完全分配给i1i2i3,但会为您的工作提供一个列表,其中组名称分配给列表项。每个组项是一个列表,包含三个从文件中读取的data.frame。如果文件不存在,该项目将为 NULL。

使用 foreach 方法

library(foreach)
list_data <- foreach(g = Groups, .final = function(x) { setNames(x, Groups) }) %do% {
  current_group <- foreach(m = 1:3) %do% {
    filename<- paste0("i",m)
    wd <- paste0("sample/", Groups[g],"_",
      m, ".csv")
    data <- ifelse(file.exists(wd) , fread(wd), NULL)
    
    return(data)
  }
  
  return(current_group)
}

使用purrr 地图

library(purrr)

item_index <- c(1:3)
all_group_data <- map(.x = Groups, .f = function(g) {
  list_files <- paste0("sample/", g,"_", item_index, ".csv")
  group_data <- map(.x = list_files, .f =  function(file) {
    if (file.exists(file)) {
      data <- fread(file)
    } else {
      data <- NULL
    }
    data
  })
  group_data
})

names(all_group_data) <- Groups

【讨论】:

  • 谢谢@Sinh Nguyen 我真的很喜欢你的 foreach 代码!但我不断收到一条错误消息,“替换长度为零”和“在 rep(no, length.out = len) 中:'x' 为 NULL,因此结果将为 NULL”......这是否必须用括号的地方循环吗?
猜你喜欢
  • 2022-07-24
  • 2017-06-22
  • 1970-01-01
  • 2010-11-25
  • 2015-01-17
  • 2010-10-22
  • 1970-01-01
  • 2012-05-16
  • 2010-09-08
相关资源
最近更新 更多