Повышение производительности обновления содержимого большого фрейма данных с использованием содержимого аналогичного фрейма данных

Я ищу общее решение для обновления одного большого фрейма данных содержимым второго аналогичного фрейма данных. У меня есть десятки наборов данных, каждый из которых содержит тысячи строк и более 10 000 столбцов. «Обновленный» набор данных будет перекрывать соответствующий «базовый» набор данных где-то от нескольких процентов до, возможно, 50 процентов по строкам. Наборы данных имеют «ключевой» столбец, и для каждого уникального значения ключа в любом заданном наборе данных будет только одна строка.

Основное правило состоит в том,:если в наборе данных обновления для данной ячейки существует значение, отличное от-NA, заменить ту же ячейку в базовом наборе данных этим значением. («Та же ячейка» означает одинаковое значение столбца «ключ» и имени столбца.)

Обратите внимание, что набор данных обновления, скорее всего, будет содержать новые строки ("вставки"), которые я могу обработать с помощью rbind.

Итак, учитывая базовый фрейм данных «df1», где столбец «K» является уникальным ключевым столбцом, а «P1»... «P3» представляют 10 000 столбцов, имена которых будут варьироваться от одной пары наборов данных к другой.:

  K P1 P2 P3
1 A  1  1  1
2 B  1  1  1
3 C  1  1  1

...и фрейм данных обновления "df2":

  K P1 P2 P3
1 B  2 NA  2
2 C NA  2  2
3 D  2  2  2

Мне нужен следующий результат, где 1 для "B" и "C" были перезаписаны 2, но не перезаписаны NA:

  K P1 P2 P3
1 A  1  1  1
2 B  2  1  2
3 C  1  2  2
4 D  2  2  2

Это не похоже на кандидата на слияние, поскольку слияние дает мне либо повторяющиеся строки (по отношению к «ключевому» столбцу ), либо повторяющиеся столбцы (, например P1.x, P1.y), которые я должен перебрать, чтобы как-то свернуть.

Я пытался предварительно-выделить матрицу с размерами последних строк/столбцов и заполнить ее содержимым df1, а затем выполнить итерацию по перекрывающимся строкам df2, но я не могу добиться большего, чем 20 ячеек на второй спектакль,для завершения требуется несколько часов (по сравнению с минутами для эквивалентной функции ОБНОВЛЕНИЯ шага ДАННЫХ в SAS).

Я уверен, что что-то упускаю, но не могу найти сопоставимого примера.

Я вижу, что использование ddply похоже, но не является общим решением. Пакет data.table, похоже, не помог, так как для меня не очевидно, что это проблема соединения, по крайней мере, обычно не так много столбцов.

Также подходит решение, которое фокусируется только на пересекающихся строках, так как я могу идентифицировать остальные и связать их.

Вот некоторый код для создания фреймов данных выше:

cat("K,P1,P2,P3", "A,1,1,1", "B,1,1,1", "C,1,1,1", file="f1.dat", sep="\n");
cat("K,P1,P2,P3", "B,2,,2", "C,,2,2", "D,2,2,2", file="f2.dat", sep="\n");
df1 <- read.table("f1.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);
df2 <- read.table("f2.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);

Спасибо

6
задан Paul Hiemstra 13 April 2012 в 16:59
поделиться