根据其他变量的条件,第一个和最后一个非缺失时间点的值。条件合并 (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
(在真实的数据集中有更多的时间点和变量需要考虑)
使用 dplyr
和 tidyr
的方法:
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
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
(在真实的数据集中有更多的时间点和变量需要考虑)
使用 dplyr
和 tidyr
的方法:
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