Получить значение последней строки, отличной от NA, для каждого столбца в data.table

#r #data.table

#r #data.table

Вопрос:

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

 a   b     c
1   2     5
1   -17   9
NA  11    4
NA  57    NA
63  NA    NA
  

Итак, из этого я хотел бы извлечь:

 a   b    c
63  57   4
  

Как я могу это сделать? Пока я вижу только ответы, касающиеся обратной ситуации извлечения последней строки, отличной от NA, для каждой строки, а не для каждого столбца.

Ответ №1:

Для тех, кто хочет использовать только base R .

 sapply(df, function(x) x[max(which(!is.na(x)))])
  

где

 df <- data.frame(a = c(1, 1, NA, NA, 63),
                 b = c(2, -17, 11, 57, NA),
                 c = c(5, 9, 4, NA, NA))
  

Ответ №2:

Если набор data.table данных равен, выполните цикл по подмножеству Data.table ( .SD ), подмножеству элемента, отличного от NA ( x[!is.na(x)] ), и извлеките последний элемент из числа тех, с tail которыми .

 df1[, lapply(.SD, function(x) tail(x[!is.na(x)],1))]
#   a  b c
#1: 63 57 4
  

Комментарии:

1. да. или apply(df1,2,function(x)x[max(which(!is.na(x)))])

2. @akrun, возможно ли это сделать по строкам? вывод: 5, 9, 4, 57, 63 ? (не уверен, заслуживает ли это нового вопроса)

3. @RafaelMartins Вероятно, вам нужно do.call(pmax, c(df1, na.rm = TRUE)) #[1] 5 9 11 57 63