Объединение кадров данных в 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-объект будет содержать агрегированное значение
Я надеюсь, что это поможет вам получить результат вашего желания.