Объединение кадров данных в R

Привет, у меня есть много файлов CSV для обработки. Каждый файл генерируется путем запуска алгоритма. Мои данные всегда имеют один ключ и значение, подобное этому:

csv1:

        index value
  1     1     1
  2     2     1
  3     3     1
  4     4     1
  5     5     1

csv2:

      index value
1     4     3
2     5     3
3     6     3
4     7     3
5     8     3

Теперь я хочу объединить данные CSV, например:

Если оба файла содержат одинаковый ключ, например. 5, результирующая строка должна содержать ключ как общий ресурс файлов (5), так и среднее значение обоих значений ((1 + 3)/2 = 2). Если только один файл содержит ключ (например, 2), эта строка просто добавляется в таблицу результатов (key = 2, value = 1).

Что-то вроде этого:

      index value
1     1     1
2     2     1
3     3     1
4     4     2 (as (1+4)/2 = 2)
5     5     2 (as (1+4)/2 = 2)
6     6     3
7     7     3
8     8     3

Сначала я думал, что rbind() выполняет задание, но не агрегирует значения, а только конкатенации данных. Как я могу достичь этого с помощью R?

Ответ 1

Вот решение. Я придерживаюсь всех замечательных замечаний и надеюсь, что добавит ценность, показывая вам, как обрабатывать любое количество файлов. Я предполагаю, что у вас есть все ваши файлы csv в том же каталоге (my.csv.dir ниже).

# locate the files
files <- list.files(my.csv.dir)

# read the files into a list of data.frames
data.list <- lapply(files, read.csv)

# concatenate into one big data.frame
data.cat <- do.call(rbind, data.list)

# aggregate
data.agg <- aggregate(value ~ index, data.cat, mean)

Изменить: обработать обновленный вопрос в комментарии ниже:

files     <- list.files(my.csv.dir)
algo.name <- sub("-.*", "", files)
data.list <- lapply(files, read.csv)
data.list <- Map(transform, data.list, algorithm = algo.name)
data.cat  <- do.call(rbind, data.list)
data.agg  <- aggregate(value ~ algorithm + index, data.cat, mean)

Ответ 2

Что я понял из вопроса, так это то, что вам нужен список, который будет содержать списки data.frame файлов csv или txt файлов и агрегировать их.

Создайте каталог и поместите все файлы csv и txt в папку. Теперь запустите следующую команду, чтобы получить результат в списке.

л = list.files(рисунок = "CSV" )

этот l-объект будет содержать имена файлов csv

т = Карта (read.csv, л)

Эта функция Map будет отображать функцию read.csv во все файлы csv, а m-объект содержит файлы csv в виде data.frame в списке.

= do.call DAT (rbind, м)

Теперь вызовите библиотеку plyr

Библиотека (plyr)

Рез = ddply (DAT, ~ индекс, обобщать, value = среднее (значение))

этот res-объект будет содержать агрегированное значение

Я надеюсь, что это поможет вам получить результат вашего желания.