我有一个数据集,我试图根据日期的顺序仅过滤到第一次非NA观察之后的数据。
mock.data <- data.frame( id = c(1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3, 3, 3 ),
date = as.Date(c("1934-06-03", "1938-06-17", "1943-06-23", "1948-06-17", "1953-06-23",
"1911-09-24", "1914-04-07", "1917-09-16", "1920-09-17", "1924-09-17",
"2008-09-09", "2012-10-06", "2016-10-14", "2020-03-03", "2022-04-14")),
price = c(33, 54, NA, 55, 67,
NA, NA, 19, NA, 22,
NA, 98, 87, 102, NA))
mock.data
id date price
1 1934-06-03 33
1 1938-06-17 54
1 1943-06-23 NA
1 1948-06-17 55
1 1953-06-23 67
2 1911-09-24 NA
2 1914-04-07 NA
2 1917-09-16 19
2 1920-09-17 NA
2 1924-09-17 22
3 2008-09-09 NA
3 2012-10-06 98
3 2016-10-14 87
3 2020-03-03 102
3 2022-04-14 NA
我想要的是基本上将其仅过滤为每个值在第一个NA
输入之后的值,而保留在第一个非NA之后出现的值。因此,理想情况下,我将获得以下内容:price
id
NA
ideal.data <- data.frame( id = c(1, 1, 1, 1, 1,
2, 2, 2,
3, 3, 3,3 ),
date = as.Date(c("1934-06-03", "1938-06-17", "1943-06-23", "1948-06-17", "1953-06-23",
"1917-09-16", "1920-09-17", "1924-09-17",
"2012-10-06", "2016-10-14", "2020-03-03", "2022-04-14")),
price = c(33, 54, NA, 55, 67,
19,NA, 22,
98, 87, 102, NA))
我已经尝试了多种方法,主要是基于整洁的方法,如下所示:
library(tidyverse)
mock.data%>%
group_by(id)%>%
arrange(date)%>%
filter( date > date[min(is.na(price))])
但是我遇到了很多错误,无法完全满足我的要求。任何帮助都非常欢迎!
基本R选项使用 ave
subset(
mock.data,
ave(!is.na(price), id, FUN = function(v) seq_along(v) >= which(v)[1])
)
给
id date price
1 1 1934-06-03 33
2 1 1938-06-17 54
3 1 1943-06-23 NA
4 1 1948-06-17 55
5 1 1953-06-23 67
8 2 1917-09-16 19
9 2 1920-09-17 NA
10 2 1924-09-17 22
12 3 2012-10-06 98
13 3 2016-10-14 87
14 3 2020-03-03 102
15 3 2022-04-14 NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句