簡體   English   中英

在日期范圍內從列(R)傳播數據

[英]Spreading data over a date range from a column (R)

我有一組調查數據,其中每個調查涵蓋了多天。 這是當前形式的數據示例:

| Survey | Dates        | Result |
|--------|--------------|--------|
| A      | 11/30 - 12/1 | 33%    |
| B      | 12/2 - 12/4  | 26%    |
| C      | 12/4 - 12/5  | 39%    |

可以使用以下示例制作此示例:

frame <- data.frame(Survey = c('A','B','C'),
                Dates = c('11/30 - 12/1', '12/2 - 12/4', '12/4 - 12/5'),
                Result = c('33%', '26%', '39%'))

我想為每個日期創建一列,如果該日期在調查范圍內,則將結果放入單元格中。 它看起來像這樣:

| Survey | 11/30 | 12/1 | 12/2 | 12/3 | 12/4 | 12/5 |
|--------|-------|------|------|------|------|------|
| A      | 33%   | 33%  |      |      |      |      |
| B      |       |      | 26%  | 26%  | 26%  |      |
| C      |       |      |      |      | 39%  | 39%  |

任何幫助,將不勝感激。

這是一個主意:

library(dplyr)
library(tidyr)

frame %>%
  separate_rows(Dates, sep = " - ") %>%
  mutate(Dates = as.Date(Dates, format = "%m/%d")) %>%
  group_by(Survey) %>%
  complete(Dates = seq(min(Dates), max(Dates), 1)) %>%
  fill(Result) %>%
  spread(Dates, Result)

這使:

#  Survey `2017-11-30` `2017-12-01` `2017-12-02` `2017-12-03` `2017-12-04` `2017-12-05`
#* <fctr>       <fctr>       <fctr>       <fctr>       <fctr>       <fctr>       <fctr>
#1      A          33%          33%           NA           NA           NA           NA
#2      B           NA           NA          26%          26%          26%           NA
#3      C           NA           NA           NA           NA          39%          39%

一個簡單的解決方案,但它要求您稍微玩一下“ Dates列:

#install.packages('tidyverse')

library(tidyverse)


dframe <- data.frame(Survey = c('A','B','C'),
                     Dates = c('11/30 - 12/1', '12/2 - 12/4', '12/4 - 12/5'),
                     Result = c('33%', '26%', '39%'), stringsAsFactors = F)

dframe$Dates <- lapply(strsplit(dframe$Dates, split = " - "), function(x) {
  x <- strptime(x, "%m/%d")
  x <- seq(min(x), max(x), '1 day')
  paste0(strftime(x, "%m/%d"), collapse = " - ")
})


dframe %>%
  separate_rows(Dates, sep = " - ") %>%
  spread(Dates, Result)

應得:

Survey 11/30 12/01 12/02 12/03 12/04 12/05
    A   33%   33%  <NA>  <NA>  <NA>  <NA>
    B  <NA>  <NA>   26%   26%   26%  <NA>
    C  <NA>  <NA>  <NA>  <NA>   39%   39%

我希望這有幫助。

暫無
暫無

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

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