[英]Create “row” from first non-NA value in an R data frame
我想創建一個“行”,其中包含出現在數據框中的第一個非 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
我希望 output 成為每列中的第一個非 NA。 執行此操作的基礎或dplyr
方法是什么? 我沒有看到它。 提前致謝。
a b c d
1 11 23 31 45
我們可以用
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
您可以使用:
library(tidyverse)
df %>% fill(everything(), .direction = "up") %>% head(1)
a b c d
<dbl> <dbl> <dbl> <dbl>
1 11 23 31 45
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.