#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