【问题标题】:How do I import multiple csv files from a folder and sort them into distinct dataframes如何从文件夹中导入多个 csv 文件并将它们分类为不同的数据框
【发布时间】:2020-08-06 16:11:24
【问题描述】:

我想从一个文件夹中导入多个 csv 文件,并根据文件名将它们分类为不同的数据框。

我的文件名模式是 chX_imgN_chYROI,其中 X 和 Y = 1、2 和 3,N = 1、2、3、4 和 5。“N”无关紧要,因为我想合并 .csv 文件基于 X 和 Y 的不同组合(例如 ch1_ch2ROI

我是新手,任何建议/见解都会有所帮助。谢谢!

【问题讨论】:

  • nano,here 的链接不仅涵盖“如何导入多个 csv 文件”,还包括对这些结果帧的一些数据管理。也就是说,如果您要对每个帧执行类似的操作,通常最好将它们存储为“帧列表”,然后使用lapply 或类似结构在其中的每个帧上迭代一个任务。

标签: r imagej


【解决方案1】:

这个问题的第一部分(导入多个csv文件)确实是How do I make a list of data frames?的重复。

但是第二部分——结合一些框架——有点不同。我将生成一些示例数据。

从重复的部分,您可能会使用以下内容来读取文件:

alldat <- sapply(list.files(somedir, pattern = "ch.*_img.*_ch.*.csv", full.names = TRUE),
                 read.csv, stringsAsFactors = FALSE,
                 simplify = FALSE)

即使您只是盲目地使用此代码,我仍然建议您仔细阅读 How do I make a list of data frames? 中的答案,因为建议和方法对 R 来说非常有效且非常地道。正确完成后,它们可以使许多工作流程更易于可视化、理解和维护。

为了模拟导入过程,我将使用这个假数据:

alldat <- list(
  "ch1_img1_ch1ROI" = mtcars[1:2,],
  "ch1_img1_ch2ROI" = mtcars[3:4,],
  "ch1_img2_ch1ROI" = mtcars[5:6,],
  "ch2_img1_ch1ROI" = mtcars[7:8,],
  "ch2_img1_ch2ROI" = mtcars[9:10,],
  "ch2_img2_ch2ROI" = mtcars[11:12,]
)
alldat
# $ch1_img1_ch1ROI
#               mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
# $ch1_img1_ch2ROI
#                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Datsun 710     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# $ch1_img2_ch1ROI
#                    mpg cyl disp  hp drat   wt  qsec vs am gear carb
# Hornet Sportabout 18.7   8  360 175 3.15 3.44 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.46 20.22  1  0    3    1
# $ch2_img1_ch1ROI
#             mpg cyl  disp  hp drat   wt  qsec vs am gear carb
# Duster 360 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
# Merc 240D  24.4   4 146.7  62 3.69 3.19 20.00  1  0    4    2
# $ch2_img1_ch2ROI
#           mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 230 22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280 19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# $ch2_img2_ch2ROI
#             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 280C  17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE 16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3

根据您的逻辑,我们有一些 X/Y 组合是唯一的,而另一些则有多个 N。让我们仅按 X/Y 组合进行分组。

  1. 首先,我们将 X 和 Y 分量提取到每个文件名的唯一字符串中:

    gsub(".*ch([0-9]+)_.*ch([0-9]+).*", "\\1_\\2", names(alldat))
    # [1] "1_1" "1_2" "1_1" "2_1" "2_2" "2_2"
    

    请注意,我们有一些帧需要组合,即元素 1 和 3,以及元素 5 和 6。

  2. split 此字符串的帧列表。请注意,我们有一个包含 4 个元素的列表,每个元素都是一个包含 1 个或多个帧的嵌套列表。

    spllists <- split(alldat, gsub(".*ch([0-9]+)_.*ch([0-9]+).*", "\\1_\\2", names(alldat)))
    str(spllists, max.level = 2)
    # List of 4
    #  $ 1_1:List of 2
    #   ..$ ch1_img1_ch1ROI:'data.frame':   2 obs. of  11 variables:
    #   ..$ ch1_img2_ch1ROI:'data.frame':   2 obs. of  11 variables:
    #  $ 1_2:List of 1
    #   ..$ ch1_img1_ch2ROI:'data.frame':   2 obs. of  11 variables:
    #  $ 2_1:List of 1
    #   ..$ ch2_img1_ch1ROI:'data.frame':   2 obs. of  11 variables:
    #  $ 2_2:List of 2
    #   ..$ ch2_img1_ch2ROI:'data.frame':   2 obs. of  11 variables:
    #   ..$ ch2_img2_ch2ROI:'data.frame':   2 obs. of  11 variables:
    
  3. 在外部列表上迭代 (lapply),合并内部列表。要进行内部行组合,我们会使用

    spllists[[1]]
    # $ch1_img1_ch1ROI
    #               mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
    # $ch1_img2_ch1ROI
    #                    mpg cyl disp  hp drat   wt  qsec vs am gear carb
    # Hornet Sportabout 18.7   8  360 175 3.15 3.44 17.02  0  0    3    2
    # Valiant           18.1   6  225 105 2.76 3.46 20.22  1  0    3    1
    do.call(rbind, spllists[[1]])
    #                                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # ch1_img1_ch1ROI.Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    # ch1_img1_ch1ROI.Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    # ch1_img2_ch1ROI.Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    # ch1_img2_ch1ROI.Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    所以要对spllists 中的所有元素执行此操作,我们将使用

    alldat2 <- lapply(spllists, function(x) do.call(rbind, x))
    alldat2
    # $`1_1`
    #                                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # ch1_img1_ch1ROI.Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    # ch1_img1_ch1ROI.Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    # ch1_img2_ch1ROI.Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    # ch1_img2_ch1ROI.Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    # $`1_2`
    #                                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # ch1_img1_ch2ROI.Datsun 710     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    # ch1_img1_ch2ROI.Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    # $`2_1`
    #                             mpg cyl  disp  hp drat   wt  qsec vs am gear carb
    # ch2_img1_ch1ROI.Duster 360 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
    # ch2_img1_ch1ROI.Merc 240D  24.4   4 146.7  62 3.69 3.19 20.00  1  0    4    2
    # $`2_2`
    #                             mpg cyl  disp  hp drat   wt qsec vs am gear carb
    # ch2_img1_ch2ROI.Merc 230   22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
    # ch2_img1_ch2ROI.Merc 280   19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
    # ch2_img2_ch2ROI.Merc 280C  17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
    # ch2_img2_ch2ROI.Merc 450SE 16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
    

【讨论】:

  • 您好,非常感谢您的回复。我浏览了您的链接以及您的代码。我无法执行以下操作:do.call(rbind, spllists[[1]]) [错误消息是:do.call(rbind, x) 中的错误:第二个参数必须是列表]。当我检查 is.list(spllists[[1]]) 时,它显示 FALSE。我理解你的代码背后的理性,但是,我无法执行它。请帮忙!
  • 我对您的数据做了几个假设。如果我的假设不正确,那么(并且一直是)您有责任提供有效的、有代表性的小样本数据。您能否阅读一下如何将其添加到您的问题中?请参阅 stackoverflow.com/q/5963269minimal reproducible examplestackoverflow.com/tags/r/info。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多