Я написал код, используемый для организации данных, отобранных с разной частотой, но я широко использовал циклы 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? Буду признателен за любую помощь! Извините, если этот вопрос слишком многословен; Я хотел ошибиться в сторону слишком большого количества информации, а не ее недостатка.