提取最新的可用年份数据

Extracting the Latest Available Year Data

我有一个相当大的长格式年度数据集,并且有大量缺失值。我正在尝试提取最近可用年份的每一列的数据点。

输入:

ID Year x y
1 2017 1 NA
1 2018 NA NA
1 2019 3 NA
1 2020 NA c
data.frame(ID=c(1,1,1,1),
           Year =c(2017, 2018, 2019, 2020),
           x=c(1, NA, 3, NA),
           y=c(NA, NA, NA, "c")
)

输出:

ID x y
1 3 c
data.frame(ID=1,
           x=3,
           y="c"
           )

非常感谢您的帮助。

你可以试试:

library(dplyr)
library(tidyr)    

dfx %>%
  pivot_longer(-c(ID, Year),
               values_transform = list(value = as.character)) %>% 
  na.omit() %>% 
  group_by(ID, name) %>% 
  filter(Year == max(Year)) %>% 
  dplyr::select(-Year) %>% 
  pivot_wider(values_from = value, names_from = name) 

# # A tibble: 1 x 3
# ID x     y    
# <dbl> <chr> <chr>
#   1     1 3     c  

您可能想针对您的问题解决一些问题,以便生成适当的回复。

  • 把题的逻辑分成Reprex。问题 有点不清楚你想如何在没有的情况下获得输出 手动选择它们。

  • Show/explain 你尝试过的方法也是如此 人们不会浪费他们的时间或觉得你没有尝试过。从 你那里有什么我会试一试,看看是否有什么帮助你。

df <- data.frame(ID=c(1,1,1,1),
           Year =c(2017, 2018, 2019, 2020),
           x=c(1, NA, 3, NA),
           y=c(NA, NA, NA, "c")
)
# Remove year like in example?
df <- df %>% 
    select(., -Year) %>%
    filter(, !is.na(y))

# Get values you want?
> df.x <- df %>% 
    select(x) %>%
    na.omit() %>%
    as.double()
# Put together
df[2] <- df.x

1) 假设行在 ID 中按年份排序,问题示例中就是这种情况——如果未排序,则首先使用 arrange(ID, Year) 对其进行排序 - - 删除 Year,按 ID 分组,填写剩余的每一列并取组的最后一行。

library(dplyr, exclude = c("lag", "filter"))
library(tidyr)

DF %>%
  select(-Year) %>%
  group_by(ID) %>%
  fill %>%
  slice_tail %>%
  ungroup

给予:

# A tibble: 1 x 3
     ID     x y    
  <dbl> <dbl> <chr>
1     1     3 c    

2) na.locf0 来自 zoo 的也可以并给出相同的结果。

library(dplyr, exclude = c("lag", "filter"))
library(zoo)

DF %>%
  select(-Year) %>%
  group_by(ID) %>%
  mutate(across(.fns = na.locf0)) %>%
  slice_tail %>%
  ungroup