2017-01-06 8 views
2

私は、各調査が複数日をカバーする一連の調査データを持っています。ここでは、データが現在の形でどのように見えるかの例です:カラム(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% | 

助けていただければ幸いです。

+4

を[最小、完全、かつ検証例](HTTPを生成する方法についてはこれらのヒントをご覧くださいこの投稿は[Rの素晴らしい例を作成する](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例)。 – lmo

+0

'data.table'と' dplyr'は良いスタートです。 – CCurtis

+0

CCurtisに言及されているものに加えて、 'tidyr'(または' tidyverse')を追加することもできます。これは、データを再構成するための次の有用なツールになる可能性が高いためです。 – steveb

答えて

3

はアイデアです:

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% 
+0

これを実行すると、「関数が見つかりませんでした」というエラーが表示されます。mutate_at "' –

0

tidyverseソリューションが、それはあなたが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% 

私はこのことができます願っています。ここで