使用前 n 个非 NA 元素创建新数据框

Create new dataframe with first n non NA elements

我想创建一个新的数据框,它从每列的顶部删除所有 NA。生成的数据框将有 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))

我们可以遍历数据的列,删除 NA 元素并使用 head 获取前 n 个元素。如果列中的非 NA 元素少于 'n',则可能 return 一个 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

使用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