0

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

目的是为 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

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

4

1 回答 1

2

一种使用dplyrand的方法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
于 2020-06-16T08:27:05.650 回答