根据其他变量的条件,第一个和最后一个非缺失时间点的值。条件合并 (dplyr)

Value of first and last non missing time point by condition of other variables. conditional coalesce (dplyr)

a/b/c为不同变量,t1为时间点1,t2为时间点2,t3为时间点3。

目的是创建两个新列:一个具有 first,一个具有每行的 last 非缺失值a_t1 到 a_t3。条件是在变量 b 和 c 中(在同一时间点)也没有缺失。

我认为 coalesce() 可以使用某种条件格式。然而,我对这方面的了解是有限的。最好是 tidyverse 解决方案,但其他解决方案也可以。

library(tidyverse)

df<-tibble::tribble(
                       ~a_t1, ~a_t2, ~a_t3, ~b_t1, ~b_t2, ~b_t3, ~c_t1, ~c_t2, ~c_t3,
                           1,    NA,     9,     2,    NA,     6,     3,    NA,     7,
                           2,    NA,     8,    NA,     5,     8,    NA,     1,     8,
                          NA,    NA,     3,     2,    NA,     9,     2,    NA,    22,
                          NA,     5,     9,     4,    NA,     9,     4,     5,    NA,
                          NA,     9,    10,    NA,     6,    11,    NA,     6,    NA
                       )

a 的第一个值的预期输出: 1, 8, 3, NA, 9

a 的最后一个值的预期输出: 9, 8, 3, NA, 9

(在真实的数据集中有更多的时间点和变量需要考虑)

使用 dplyrtidyr 的方法:

library(dplyr)
library(tidyr)

df %>%
  #Create a row number
  mutate(row = row_number()) %>%
  #Get data in long format
  pivot_longer(cols = -row) %>%
  #Separate the data in two columns
  separate(name, c('name1', 'name2'), sep = '_') %>%
  #Group by each row and t1, t2 columns
  group_by(row, name2) %>%
  #Drop groups with all `NA` values
  filter(all(!is.na(value))) %>%
  #For each row get first and last value for "a" columns
  group_by(row) %>%
  summarise(first = first(value[name1 == 'a']), 
            last = last(value[name1 == 'a'])) %>%
  #Complete the data for missing rows.
  complete(row = 1:nrow(df))

#    row first last
#  <int> <dbl> <dbl>
#1     1     1     9
#2     2     8     8
#3     3     3     3
#4     4    NA    NA
#5     5     9     9