首页 > 解决方案 > 从 R 数据框中的第一个非 NA 值创建“行”

问题描述

我想创建一个“行”,其中包含出现在数据框中的第一个非 NA 值。例如,给定这个测试数据框:

test.df <- data.frame(a=c(11,12,13,14,15,16),b=c(NA,NA,23,24,25,26), c=c(31,32,33,34,35,36), d=c(NA,NA,NA,NA,45,46))
test.df
   a  b  c  d
1 11 NA 31 NA
2 12 NA 32 NA
3 13 23 33 NA
4 14 24 34 NA
5 15 25 35 45
6 16 26 36 46

我知道我可以像这样检测到非 NA 的第一次出现:

first.appearance <- as.numeric(sapply(test.df, function(col) min(which(!is.na(col)))))
first.appearance
[1] 1 3 1 5

这告诉我第 1 列中的第一个元素不是 NA,第 2 列中的第三个元素不是 NA,第 3 列中的第一个元素不是 NA,第 4 列中的第五个元素不是 NA。但是当我把这些碎片放在一起时,它会产生这个(这是合乎逻辑的,但不是我想要的):

> test.df[first.appearance,]
     a  b  c  d
1   11 NA 31 NA
3   13 23 33 NA
1.1 11 NA 31 NA
5   15 25 35 45

我希望输出是每列中的第一个非 NA。这样做的基础或dplyr方法是什么?我没有看到它。提前致谢。

   a  b  c  d
1 11 23 31 45

标签: rdataframedplyr

解决方案


我们可以用

library(dplyr)
test.df %>% 
    slice(first.appearance) %>%
    summarise_all(~ first(.[!is.na(.)]))
#   a  b  c  d
#1 11 23 31 45

或者它可以是

test.df %>% 
     summarise_all(~ min(na.omit(.)))
#   a  b  c  d
#1 11 23 31 45

或与colMins

library(matrixStats)
colMins(as.matrix(test.df), na.rm = TRUE)
#[1] 11 23 31 45

推荐阅读