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