在日期列中填充前一行中的下一个日期

时间:2019-09-10 09:31:02

标签: r date dataframe dplyr zoo

我必须在数据框中填充日期列,最后一天再加一天,然后最后一天(再加一天)。它不会填补缺失的日期,因为从最后一个日期开始没有更多的日期,因此没有空白。

还有更多的列,但是为了示例起见,让我们保持简单。

df <- structure(list(dates = c("1991-01-01", "1991-01-02", "1991-01-03", 
NA, NA, NA)), row.names = c(NA, 6L), class = c("tbl_df", "tbl", 
"data.frame"))

# A tibble: 6 x 1
  dates     
* <chr>     
1 1991-01-01
2 1991-01-02
3 1991-01-03
4 NA        
5 NA        
6 NA 

我知道我可以用序列(seq.Date)代替它,但是我想前一段时间,我在某个地方读到了一个优雅的函数,可以使用最后一个日期和一个滞后来填充向量。

预期结果:

# A tibble: 6 x 1
  dates     
* <chr>     
1 1991-01-01
2 1991-01-02
3 1991-01-03
4 1991-01-04   
5 1991-01-05        
6 1991-01-06   

类似于zoo::na.locf(),但考虑到日期,我事先并不知道“发件人”和“发件人”

有任何提示吗?

3 个答案:

答案 0 :(得分:2)

另一种public class NetworkManager : MonoBehaviour, IMatchmakingCallbacks, IOnEventCallback { public const byte InstantiateVrAvatarEventCode = 1; public void OnJoinedRoom() // w/o override { // code from the tutorial here } public void OnEvent(EventData photonEvent) { // code from the tutorial here } private void OnEnable() { PhotonNetwork.AddCallbackTarget(this); } private void OnDisable() { PhotonNetwork.RemoveCallbackTarget(this); } #region Unused IMatchmakingCallbacks public void OnFriendListUpdate(List<FriendInfo> friendList) { } public void OnCreatedRoom() { } public void OnCreateRoomFailed(short returnCode, string message) { } public void OnJoinRoomFailed(short returnCode, string message) { } public void OnJoinRandomFailed(short returnCode, string message) { } public void OnLeftRoom() { } #endregion } dplyr的可能性是:

tidyr

或者仅涉及df %>% mutate(dates = as.Date(dates, format = "%Y-%m-%d")) %>% fill(dates) %>% mutate(dates = if_else(duplicated(dates), dates + cumsum(duplicated(dates)), dates)) dates <date> 1 1991-01-01 2 1991-01-02 3 1991-01-03 4 1991-01-04 5 1991-01-05 6 1991-01-06 的可能性:

dplyr

答案 1 :(得分:1)

我们可以尝试用先前的值fill缺少日期,并向其中添加cumsum的值NA

library(dplyr)

df %>%
  mutate(temp = +(is.na(dates)), 
        dates = as.Date(dates)) %>% 
  tidyr::fill(dates) %>%
  mutate(dates_new = dates + cumsum(temp)) %>%
  select(-temp)

#   dates      dates_new 
#  <date>     <date>    
#1 1991-01-01 1991-01-01
#2 1991-01-02 1991-01-02
#3 1991-01-03 1991-01-03
#4 1991-01-03 1991-01-04
#5 1991-01-03 1991-01-05
#6 1991-01-03 1991-01-06

答案 2 :(得分:1)

这是基本的R主意,

as.Date(max(df$dates, na.rm = TRUE)) + seq(sum(is.na(df$dates)))
#[1] "1991-01-04" "1991-01-05" "1991-01-06"

或将它们分配回您的数据框,即

df$dates[is.na(df$dates)] <- as.character(as.Date(max(df$dates, na.rm = TRUE)) + seq(sum(is.na(df$dates))))

df
#1 1991-01-01
#2 1991-01-02
#3 1991-01-03
#4 1991-01-04
#5 1991-01-05
#6 1991-01-06