У меня есть несколько фреймов данных, содержащих 18 столбцов с прибл. 50000 рядов. Каждая запись строки представляет собой измерение в определенном месте (= столбец), и данные содержат значения NA.
Мне нужно вычесть последовательные строки в столбце (например, row (i + 1) -row (i)) для определения пороговых значений, но мне нужно игнорировать (и сохранять) NA, так что только записи с числовыми значениями вычитаются друг из друга.
Я нашел очень полезные посты с data.table
решениями дляодин столбец Итерация по столбцу, игнорирующая, но сохраняющая значения NA в R , и для операций с несколькими столбцами (например, Суммирование нескольких столбцов с помощью dplyr? ).
Однако мне не удалось объединить подходы, предложенные в SO (то есть применить diff
к нескольким столбцам и игнорировать NA)
Вот пример df для иллюстрации и решения Iпопробовал:
library(data.table)
df <- data.frame(x=c(1:3,NA,NA,9:7),y=c(NA,4:6, NA,15:13), z=c(6,2,7,14,20, NA, NA, 2))
вот как это работает для одного столбца
diff_x <- df[!is.na(x), lag_diff := x - shift(x)] # actually what I want, but for more columns at once
и вот как я применяю функцию diff
для нескольких столбцов с lapply
diff_all <- setDT(df)[,lapply(.SD, diff)] # not exactly what I want because NAs are not ignored and the difference between numeric values is not calculated
Буду признателен за любые предложения (base
, data.table
, dplyr
, ... решения) о том, как внедрить действительный !is.na
или аналогичный оператор в эту вторую строку кода.