2017-08-12 15 views
0

データフレームを日付範囲で整理したいと思います。Rデータフレームを日付範囲でサブセット化する

今日は考えることは2017年1月1日であり、以下の表には示しています。製品の

  • 3種類(アップル、バナナとビール)

  • ファイブ有効期限を(1月15日/ 2017年、2017年2月27日、2017年3月15日、2017年9月1日と2018年1月10日)

 
Product Type 1/15/2017 2/27/2017 3/15/2017 9/1/2017 12/20/2017 1/10/2018 
Apple   3   10   -   2   8   - 
Banana   5   50   100   10   10   2 
Beer   1   1   1   1   1   1

あなたは「お店として、上記の表を読むことができますマネージャーには、2011年1月15日の有効期限を持つ3つのリンゴ、20分遅れ、20/27/2017の有効期限を持つ他の10のリンゴがあります。

店長は、1ヶ月以内、1〜3ヶ月間、3〜12ヶ月間および12ヶ月以上で期限切れになるリンゴの数を知りたいと考えています。

Rでこれをコードするにはどうすればよいですか? 結果テーブルには、次のようになります。

 
Product Type  Less than 1mth 1-3mths  3-12 mths  More than 12mths 
Apple   3     10   10    - 
Banana   5     150   20    2 
Beer    1     2    2    1

はあなたの助けのためにありがとうございました!

+0

まだコードを作成しようとしましたか?あなたのアイデアは何ですか? –

答えて

0

data.table答え:

library(data.table) 

dt <- data.table(type=c("apple", "banana", "beer"), 
       `2017-01-15`=c(3,5,1), 
       `2017-02-27`=c(10,50,1), 
       `2017-03-15`=c(NA, 100, 1), 
       `2017-09-01`=c(2,10,1), 
       `2017-12-20`=c(8,10,1), 
       `2018-01-10`=c(NA, 2, 1)) 

dt2 <- melt(dt, id.vars=c("type")) 
dt2[, days_until_expires:=as.IDate(variable) - as.IDate("2017-01-01")] 
dt2[, days_until_expires_f:=cut(days_until_expires, c(0, 30, 90, 360, Inf))] 

out1 <- dt2[, list(N=sum(value, na.rm=T)), by=list(type, days_until_expires_f)] 
out2 <- dcast(out1, type ~ days_until_expires_f, value.var="N") 

out2はあなたの出力です。

今後は、ユーザーが完全な最小作業例(MWE)を提供することで、より簡単に手助けすることができます。ガイダンスについては、hereを参照してください。

2

機能を使用する溶液tidyverseおよびlubridatedt2が最終出力です。

dt <- read.table(text = "'Product Type' '1/15/2017' '2/27/2017' '3/15/2017' '9/1/2017' '12/20/2017' '1/10/2018' 
Apple   3   10   -   2   8   - 
       Banana   5   50   100   10   10   2 
       Beer   1   1   1   1   1   1", 
       header = TRUE, stringsAsFactors = FALSE, na.strings = "-") 


library(tidyverse) 
library(lubridate) 

dt2 <- dt %>% 
    gather(Date, Value, -Product.Type) %>% 
    mutate(Date = sub("X", "", Date, fixed = TRUE)) %>% 
    mutate(Date = mdy(Date)) %>% 
    mutate(Day_Diff = Date - mdy("1/1/2017")) %>% 
    mutate(Group = case_when(
    Day_Diff <= 30 ~ "Less than 1mth", 
    Day_Diff <= 90 ~ "1-3mths", 
    Day_Diff <= 361 ~ "3-12 mths", 
    TRUE   ~ "More than 12mths" 
)) %>% 
    group_by(Product.Type, Group) %>% 
    summarise(Value = sum(Value, na.rm = TRUE)) %>% 
    spread(Group, Value) %>% 
    select(`Product Type` = Product.Type, `Less than 1mth`, `1-3mths`, 
     `3-12 mths`, `More than 12mths`) 
0

ここtidyverseからのソリューションです:

library(tidyverse) 
library(lubridate) 
df <- cbind(c("Apple","Banana","Beer"),data.frame(matrix(c(3,5,1, 
          10,50,1, 
          "na",100,1, 
          2,10,1, 
          8,10,1, 
          "na",2,1), nrow = 3, ncol = 6))) 
colnames(df) <- c("Product_Type","1/15/2017","2/27/2017","3/15/2017", 
        "9/1/2017", "12/20/2017", "1/10/2018") 
df_long <- gather(df, key = date_range, fruit, 
        c("1/15/2017","2/27/2017","3/15/2017", 
        "9/1/2017", "12/20/2017", "1/10/2018"), factor_key = TRUE) 
df_final <- as_tibble(df_long) %>% 
    mutate(date_range = mdy(date_range)) %>% 
    mutate(date_range = date_range - mdy("1/1/2017")) %>% 
    mutate(months = ifelse(date_range >= 361,"More than 12mths", 
         ifelse(between(date_range,90,361), "3-12 mths", 
           ifelse(between(date_range,30,90),"1-3mths", 
             "Less than 1mth")))) %>% 
    group_by(Product_Type,months) %>% 
    summarise(fruit = sum(as.integer(fruit), na.rm = T)) %>% 
    spread(months,fruit) 
関連する問題