Я ищу общее решение для обновления одного большого фрейма данных содержимым второго аналогичного фрейма данных. У меня есть десятки наборов данных, каждый из которых содержит тысячи строк и более 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);
Спасибо