r语言 - 按其他变量的条件划分的第一个和最后一个非缺失时间点的值. 条件合并(DPLYR)



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

目的是创建两个新列:一个包含a_t3 a_t1的每一行的第一列,另一个包含最后一个非缺失值。条件是它在变量 b 和 c 中也不丢失(在同一时间点(。

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

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

最新更新