提取最新的可用年份数据
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
我有一个相当大的长格式年度数据集,并且有大量缺失值。我正在尝试提取最近可用年份的每一列的数据点。
输入:
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