使用前 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
我想创建一个新的数据框,它从每列的顶部删除所有 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