Создать «строку» из первого значения не-NA в кадре данных R - PullRequest
1 голос
/ 23 апреля 2020

Я хочу создать «строку», содержащую первое не-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

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете использовать:

library(tidyverse)
df %>% fill(everything(), .direction = "up") %>% head(1)

       a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1    11    23    31    45
1 голос
/ 23 апреля 2020

Мы можем использовать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...