簡體   English   中英

根據數據框中的開始/結束值填寫NA值

[英]Fill in NA values based on beginning/end value in data frame

我目前有一個帶有開始和結束值的數據框。 我需要它們在開始值和結束值之間“填充”。 需要注意的是:仍有許多值需要保持NA。

上下文:我正在跟蹤持續一定天數的事件。 例如(如下所示),一個事件可能會持續3天,或者可能會持續6天。另一方面,如果在幾天內沒有事件發生,我需要將該事件保留為NA。

以下是當前情況:

Date        value event event_detail
2017-03-30  12    NA    NA
2017-03-31  14    NA    NA
2017-04-01  15    A     Y
2017-04-02  20    NA    NA
2017-04-03  17    A     Y
2017-04-04  20    NA    NA
2017-04-05  14    NA    NA

這就是我想要的:

Date        value event event_detail
2017-03-30  12    NA    NA
2017-03-31  14    NA    NA
2017-04-01  15    A     Y
2017-04-02  20    A     Y
2017-04-03  17    A     Y
2017-04-04  20    NA    NA
2017-04-05  14    NA    NA

棘手的情況是,例如在4月3日之后,可能有一段時間沒有活動了,我不希望填寫事件“ A”或詳細信息“ Y”。

有任何想法嗎? 謝謝。

如果您只是想向后傳遞一個值,那么zoo::na.locf() (上次觀察zoo::na.locf()可以執行此操作(基本上它變為下一個后結觀察)。

library(zoo)

mydata <- 
    data.frame(stringsAsFactors=FALSE,
               Date = c("1/04/2017", "2/04/2017", "3/04/2017", "4/04/2017",
                        "5/04/2017"),
               value = c(15L, 20L, 17L, 20L, 14L),
               event = c("A", NA, "A", NA, NA),
               event_detail = c("Y", NA, "Y", NA, NA)
               )

mydata$event <- na.locf(mydata$event, fromLast = TRUE, na.rm = FALSE)
mydata$event_detail <- na.locf(mydata$event_detail, fromLast = TRUE, na.rm = FALSE)

mydata

       Date value event event_detail
1 1/04/2017    15     A            Y
2 2/04/2017    20     A            Y
3 3/04/2017    17     A            Y
4 4/04/2017    20  <NA>         <NA>
5 5/04/2017    14  <NA>         <NA>

在執行此操作之前,請記住對數據進行排序!

編輯:剛剛看到您也有dplyr標簽。 就是這樣:

mydata %<>%
    mutate_at(vars(starts_with("event")), na.locf, fromLast = TRUE, na.rm = FALSE)

如果您知道間隔的大小將小於na.locf觀察之間的時間間隔,則還可以限制na.locf的范圍。

mydata <- 
    data.frame(stringsAsFactors=FALSE,
               Date = c("30/03/2017", "31/03/2017", "1/04/2017", "2/04/2017",
                        "3/04/2017", "4/04/2017", "5/04/2017"),
               value = c(12L, 14L, 15L, 20L, 17L, 20L, 14L),
               event = c(NA, NA, "A", NA, "A", NA, NA),
               event_detail = c(NA, NA, "Y", NA, "Y", NA, NA)
    )

mydata %<>%
    mutate_at(vars(starts_with("event")), na.locf, fromLast = TRUE, 
              na.rm = FALSE, maxgap = 1)

mydata

        Date value event event_detail
1 30/03/2017    12  <NA>         <NA>
2 31/03/2017    14  <NA>         <NA>
3  1/04/2017    15     A            Y
4  2/04/2017    20     A            Y
5  3/04/2017    17     A            Y
6  4/04/2017    20  <NA>         <NA>
7  5/04/2017    14  <NA>         <NA>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM