R-在NA时将行折叠到最近的日期

R-在NA时将行折叠到最近的日期,r,dplyr,R,Dplyr,假设我有这个数据帧: Date A B 2010-01-01 NA 1 2010-01-02 2 NA 2010-01-05 3 NA 2010-01-07 NA 4 2010-01-20 5 NA 2010-01-25 6 7 我想折叠行,删除最接近日期的NA值。因此,结果将是: Date A B 2010-01-02 2 1 2010-01-07 3 4 2010-01-20 5 NA 2010-01-25 6

假设我有这个数据帧:

Date        A   B
2010-01-01  NA  1
2010-01-02  2   NA
2010-01-05  3   NA
2010-01-07  NA  4
2010-01-20  5   NA
2010-01-25  6   7
我想折叠行,删除最接近日期的NA值。因此,结果将是:

Date        A  B
2010-01-02  2  1
2010-01-07  3  4
2010-01-20  5  NA
2010-01-25  6  7
我看到了使用键值解决折叠问题的堆栈溢出,但我找不到使用关闭日期值进行折叠的类似情况

Obs1:如果日期相距太远(例如:相距超过15天),如果有办法不折叠行,那就太好了


Obs2:如果折叠行保持后一个日期而不是前一个日期就好了,如上面的示例所示。

使用
dplyr
包,一个选项可以是通过
A
B
组合对U进行
分组,以形成完整的值

考虑到
Obs#2
组合行应采用日期的
max

library(dplyr)
library(lubridate)
df %>% mutate(Date = ymd(Date)) %>%
  mutate(GrpA = cumsum(!is.na(A)), GrpB = cumsum(!is.na(B))) %>%
  rowwise() %>%
  mutate(Grp = max(GrpA, GrpB)) %>%
  ungroup() %>%
  select(-GrpA, -GrpB) %>%
  group_by(Grp) %>%
  summarise(Date = max(Date), A = A[!is.na(A)][1], B = B[!is.na(B)][1])

# # A tibble: 4 x 4
# Grp Date           A     B
# <int> <date>     <int> <int>
# 1     1 2010-01-02     2     1
# 2     2 2010-01-07     3     4
# 3     3 2010-01-20     5    NA
# 4     4 2010-01-25     6     7
库(dplyr)
图书馆(lubridate)
df%>%突变(日期=ymd(日期))%>%
突变(GrpA=cumsum(!is.na(A)),GrpB=cumsum(!is.na(B)))%>%
行()
突变(Grp=max(GrpA,GrpB))%>%
解组()%>%
选择(-GrpA,-GrpB)%>%
分组依据(Grp)%>%
总结(日期=最大(日期),A=A[!is.na(A)][1],B=B[!is.na(B)][1])
##tibble:4 x 4
#Grp日期A B
#        
# 1     1 2010-01-02     2     1
# 2     2 2010-01-07     3     4
#3 2010-01-20 5北美
# 4     4 2010-01-25     6     7
数据:

df <- read.table(text = 
"Date        A   B
2010-01-01  NA  1
2010-01-02  2   NA
2010-01-05  3   NA
2010-01-07  NA  4
2010-01-20  5   NA
2010-01-25  6   7",
stringsAsFactors = FALSE, header = TRUE)

df您希望折叠超过2行吗?仅在有NA的地方折叠(因此在上面的示例中,答案是否)。如果有更多的列,则可能会折叠超过2行。是的。我在考虑类似的问题,在解决方案中,我试图崩溃,直到
A
B
都得到
非NA
值。这不起作用。例如,使用以下df,B=5的直线消失:df@Daniel这是真的。它没有考虑那个案子。让我再看看。