Перемещение значений между строками без цикла for в R

Я написал код, используемый для организации данных, отобранных с разной частотой, но я широко использовал циклы for, которые значительно замедляют работу кода, когда набор данных большой. Я просматривал свой код, ища способы убрать циклы for, чтобы ускорить его, но один из циклов поставил меня в тупик.

В качестве примера предположим, что данные были дискретизированы с частотой 3 Гц, поэтому я получаю три строки на каждую секунду данных. Однако переменные A, B и C выбираются с частотой 1 Гц каждая, поэтому я буду получать одно значение каждые три строки для каждой из них. Выборка переменных производится последовательно в течение одной секунды, что приводит к диагональному характеру данных.

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

Моя цель такова: определив строки, которые я хочу сохранить, я хочу переместить значения, отличные от NA, из последующих строк вверх в строки-хранители. Если бы не проблема с потерянными данными, я бы всегда сохранял строку, содержащую значение для первой переменной, но если одна из этих строк потеряна, я сохраню следующую строку.

В приведенном ниже примере теряются шестой и десятый отсчеты.

A <- c(1, NA, NA, 4, NA, 7, NA, NA, NA, NA)
B <- c(NA, 2, NA, NA, 5, NA, 8, NA, 11, NA)
C <- c(NA, NA, 3, NA, NA, NA, NA, 9, NA, 12)

test_df <- data.frame(A = A, B = B, C = C)

test_df
     A  B  C
 1   1 NA NA
 2  NA  2 NA
 3  NA NA  3
 4   4 NA NA
 5  NA  5 NA
 6   7 NA NA
 7  NA  8 NA
 8  NA NA  9
 9  NA 11 NA
10  NA NA 12

keep_rows <- c(1, 4, 6, 9)

После того, как я переместил значения в ведущие строки, я удалю промежуточные строки, что приведет к следующему:

test_df <- test_df[keep_rows, ]
test_df
     A  B  C
 1   1  2  3
 2   4  5 NA
 3   7  8  9
 4  NA 11 12

В конце концов, мне нужна только одна строка на каждую секунду данных, а значения NA должны оставаться только где была потеряна строка исходных данных.

Есть ли у кого-нибудь идеи, как переместить данные вверх без использования цикла for? Буду признателен за любую помощь! Извините, если этот вопрос слишком многословен; Я хотел ошибиться в сторону слишком большого количества информации, а не ее недостатка.

7
задан Patrigon 28 October 2011 в 15:57
поделиться