Как импортировать несколько файлов CSV из папки и отсортировать их по отдельным фреймам данных - PullRequest
0 голосов
/ 06 августа 2020

Я хотел импортировать несколько файлов csv из папки и отсортировать их в отдельные фреймы данных на основе имени файла.

Образец имени моего файла - chX_imgN_chYROI, где X & Y = 1, 2 & 3, N = 1,2,3,4 & 5. 'N' не имеет значения, поскольку я хочу объединить файлы .csv на основе различных комбинаций X и Y (например, ch1_ch2ROI <- ch1_img1_ch2ROI, ch1_img2_ch2ROI ..... ch1_img5_ch2ROI) </p>

Я новичок, и любые предложения / идеи будут полезны. Спасибо!

1 Ответ

0 голосов
/ 06 августа 2020

Первая часть этого вопроса (импорт нескольких файлов csv) на самом деле дублирует Как мне составить список фреймов данных? .

Но вторая часть - объединение некоторые кадры - немного другое. Я сгенерирую несколько примеров данных.

Из дублирующей части вы, вероятно, использовали бы что-то вроде ниже для чтения в файлах:

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

Даже если вы просто используете этот код вслепую , Я все еще рекомендую вам прочитать ответы в Как мне составить список фреймов данных? , так как советы и методология эффективны и очень идиоматичны c для Р. Готово правильно, они могут значительно упростить визуализацию, понимание и поддержку многих рабочих процессов.

Чтобы имитировать c процесс импорта, я буду использовать эти поддельные данные:

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

По вашему logi c, у нас есть несколько комбинаций 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
    
...