Подберите один столбец из множества файлов и объедините в одну матрицу в R - PullRequest
0 голосов
/ 13 мая 2011

У меня есть много файлов данных (* .dat) со столбцами (все файлы в одном и том же формате), я хочу взять по одному столбцу (одинаковое положение во всех файлах) каждого файла и объединить их во фрейм данных.

Не могли бы вы сказать, возможно ли это в R?И как?


У меня около 200 файлов (23х7).Вот мой файл данных:

  12000.0000       77.17   59.09    0.17        1.82   59.09   32.4564
   6000.0000       77.52   32.68    0.11        1.83   32.68   17.8731
   3000.0000       77.80   18.98    0.12        1.83   18.98   10.3449
   1500.0000       77.99   11.23    0.12        1.84   11.23    6.1084
    750.0000       78.13    6.93    0.15        1.84    6.93    3.7636
    375.0000       78.21    4.53    0.28        1.84    4.53    2.4552
    187.5000       78.27    3.37    0.51        1.85    3.37    1.8253
     93.7500       78.36    2.84    0.99        1.85    2.84    1.5387
     46.8750       78.48    2.04    1.37        1.85    2.04    1.1049
     23.4375       78.53    0.98    0.17        1.85    0.98    0.5291
     11.7188       78.52   -0.23    0.15        1.85   -0.23   -0.1242
      5.8594       78.48   -0.74    0.08        1.85   -0.74   -0.3973
      2.9297       78.44   -0.83    0.03        1.85   -0.83   -0.4499
      1.4648       78.43   -1.49    0.06        1.85   -1.49   -0.8059
      0.7324       78.40   -3.20    0.15        1.85   -3.20   -1.7297
      0.3662       78.24   -5.33    0.04        1.85   -5.33   -2.8879
      0.1831       77.94   -6.84    0.07        1.84   -6.84   -3.7212
      0.0916       77.71   -5.76    0.08        1.83   -5.76   -3.1449
      0.0458       77.35   -3.57    0.11        1.82   -3.57   -1.9588
      0.0229       77.44   -0.88    0.13        1.83   -0.88   -0.4810
      0.0114       77.31    0.72    0.23        1.82    0.72    0.3928
      0.0057       77.59    1.63    0.51        1.83    1.63    0.8929
      0.0029       77.61    0.34    2.65        1.83    0.34    0.1841

Я хочу взять столбец 6 и объединить его с шестым столбцом из других файлов, чтобы получить матрицу (23x200).

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Другой способ сделать это (основываясь на ответе @ mdsumner) будет (не проверен):

# get a list of files
my.file.list <- list.files(pattern = "dat$")
# for each file, run read.table and select only the first column
my.list <- lapply(X = my.file.list, FUN = function(x) {
            read.table(x, colClasses = c("NULL", "NULL", "numeric", "NULL"), sep = ",")[,1]
        })
# merge columns that are in a list into one data.frame
my.df <- do.call("cbind", my.list)
2 голосов
/ 13 мая 2011

Если вы хотите третий столбец файла, который имеет заголовки и разделитель запятых:

d <- read.table("file.dat", colClasses = c("NULL", "NULL", "numeric", "NULL"), sep = ",")

Замените «числовой» на другой класс в зависимости от ситуации - и столько «NULL», сколько требуется для описания каждого столбца в файле.

Чтобы получить каждый файл с именем "* .dat" в текущем каталоге:

fs <- list.files(pattern = "dat$")

Чтобы построить матрицу из всех этих столбцов и тех же классов и количества столбцов, как указано выше:

mat <- NULL
for (i in 1:length(fs)) {
 mat <- cbind(mat, read.table(fs[i], colClasses = c("NULL", "NULL", "numeric", "NULL"), sep = ",")
}

Для достаточно больших файлов данных вы должны предварительно выделить матрицу, которую вы можете узнать за один раз, прочитав один файл (и предполагая, что все они имеют одинаковое количество строк, а также структуру:

d0 <- read.table(fs[1], colClasses = c("NULL", "NULL", "numeric", "NULL"), sep = ",")[,1]
nr <- nrow(d0)

Теперь вышеприведенный цикл становится более эффективным с использованием памяти:

mat <- matrix("numeric", nrow = nr, ncol = length(fs))
for (i in 1:length(fs)) {
 mat[,i] <- read.table(fs[i], colClasses = c("NULL", "NULL", "numeric", "NULL"), sep = ",")[,1]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...