Создайте новый фрейм данных с первыми n элементами, отличными от NA

#r #dataframe #na

Вопрос:

Я хочу создать новый фрейм данных, который удаляет все NAs из верхней части каждого столбца. Результирующий фрейм данных будет содержать n-maxNA строк, n-размер исходного фрейма данных, maxNA-максимальная длина NA для всех столбцов. Вот воспроизводимый пример.

Это входные данные

 structure(list(X1 = c(NA, NA, NA, NA, 7L, 0L, 6L, 1L, 9L, 6L), 
    X2 = c(NA, NA, 1L, 10L, 2L, 9L, 1L, 8L, 4L, 1L), X3 = c(NA, 
    NA, NA, NA, NA, 6L, 8L, 6L, 9L, 8L), X4 = c(7L, 4L, 1L, 5L, 
    10L, 0L, 7L, 5L, 2L, 7L)), row.names = c(NA, -10L), class = "data.frame")
 

И результат должен выглядеть так

 structure(list(x1 = c(7L, 0L, 6L, 1L, 9L), x2 = c(1L, 10L, 2L, 
9L, 1L), x3 = c(6L, 8L, 6L, 9L, 8L), x4 = c(7L, 4L, 1L, 5L, 10L
)), class = "data.frame", row.names = c(NA, -5L))
 

Ответ №1:

Мы можем перебирать столбцы данных, удалять NA элементы и получать первые n элементы head . Если в столбце меньше » n » элементов, отличных от NA, он может возвращать значение a list , поскольку data.frame требуется, чтобы все столбцы были равными length

 sapply(df1, function(x) head(na.omit(x), 5))
      X1 X2 X3 X4
[1,]  7  1  6  7
[2,]  0 10  8  4
[3,]  6  2  6  1
[4,]  1  9  9  5
[5,]  9  1  8 10
 

Ответ №2:

С помощью dplyr

 library(dplyr)

n <- 5
df %>% summarise(across(.fns = ~.x[!is.na(.x)][1:n]))

#  X1 X2 X3 X4
#1  7  1  6  7
#2  0 10  8  4
#3  6  2  6  1
#4  1  9  9  5
#5  9  1  8 10