私はRに比較的慣れていないので、この質問が基本的すぎる場合は申し訳ありません。
さまざまな製品から販売された数量と収益を示すトランザクションがあります。3 つの商品があるため、2^3 = 8
これらの商品を「バスケット」で販売するための組み合わせがあります。各バスケットは、指定された 3 つの年 (2016、2017、2018) のいずれか、およびゾーン (東と西) のいずれかで販売できます。[イーストとウエストの 2 つのゾーンで 3 年分の取引があります。]
私の目的は、特定のゾーンで特定の年にこれらの製品の組み合わせごとに、どれだけの収益が得られたか、販売された数量、および発生したトランザクションの数を分析することです。
purrr::map
ゾーンに基づいてデータを分割することで、上記の操作を ( を使用して) 行うことができました。上記の組み合わせごとに、「年」でグループ化されたデータを保持する 2 つのデータ フレームのリストを作成しました。これはうまくいきます。ただし、私の意見では、コードは少し不格好です。繰り返し発言が多い。2X3 (2 ゾーンと 3 年) のリストを作成できるようにしたい
ゾーンごとの分割を使用したコードは次のとおりです。
初挑戦
UZone <- unique(Input_File$Zone)
FYear <- unique(Input_File$Fiscal.Year)
#Split based on zone
a<-purrr::map(UZone, ~ dplyr::filter(Input_File, Zone == .)) %>%
#Create combinations of products
purrr::map(~mutate_each(.,funs(Exists = . > 0), L.Rev:I.Qty )) %>%
#group by Fiscal Year
purrr::map(~group_by_(.,.dots = c("Fiscal.Year", grep("Exists", names(.), value = TRUE)))) %>%
#Summarize, delete unwanted columns and rename the "number of transactions" column
purrr::map(~summarise_each(., funs(sum(., na.rm = TRUE), count = n()), L.Rev:I.Qty)) %>%
purrr::map(~select(., Fiscal.Year:L.Rev_count)) %>%
purrr::map(~plyr::rename(.,c("L.Rev_count" = "No.Trans")))
#Now do Zone and Year-wise splitting : Try 1
EastList<-a[[1]]
EastList <- EastList %>% split(.$Fiscal.Year)
WestList<-a[[2]]
WestList <- WestList %>% split(.$Fiscal.Year)
write.xlsx(EastList , file = "East.xlsx",row.names = FALSE)
write.xlsx(WestList , file = "West.xlsx",row.names = FALSE)
ご覧のとおり、上記のコードは非常に不格好です。R の知識が限られているため、https://blog.rstudio.org/2016/01/06/purrr-0-2-0/を調べてマニュアルを読みpurrr::map2()
ましたが、あまり多くの例を見つけることができませんでした。ベクターのリストを data.frame オブジェクトのリストに並列で新しいスロットとして追加する方法のソリューションを読んだ後? 、X = ゾーンとY = 会計年度を使用して、上記で行ったことを実行できると想定しています。
これが私が試したことです: セカンドトライ
#Now try Zone and Year-wise splitting : Try 2
purrr::map2(UZone,FYear, ~ dplyr::filter(Input_File, Zone == ., Fiscal.Year == .))
しかし、このコードは機能しません。次のようなエラー メッセージが表示されます。
Error: .x (2) and .y (3) are different lengths
質問 1:map2
自分がやろうとしていることを行うために使用できますか? そうでない場合、他に良い方法はありますか?
質問 2:念のため、 を使用できmap2
ますが、1 つのコマンドで 2 つの Excel ファイルを生成するにはどうすればよいですか? 上記のように、上記の 2 つの関数呼び出しがあります。1つだけ持っていたいです。
質問 3:以下の 2 つのステートメントの代わりに、合計とカウントを 1 つのステートメントで行う方法はありますか? 合計とカウントを行うためのよりクリーンな方法を探しています。
purrr::map(~summarise_each(., funs(sum(., na.rm = TRUE), count = n()), L.Rev:I.Qty)) %>%
purrr::map(~select(., Fiscal.Year:L.Rev_count)) %>%
誰か助けてくれませんか?
ここに私のデータがあります:
dput(Input_File)
structure(list(Zone = c("East", "East", "East", "East", "East",
"East", "East", "West", "West", "West", "West", "West", "West",
"West"), Fiscal.Year = c(2016, 2016, 2016, 2016, 2016, 2016,
2017, 2016, 2016, 2016, 2017, 2017, 2018, 2018), Transaction.ID = c(132,
133, 134, 135, 136, 137, 171, 171, 172, 173, 175, 176, 177, 178
), L.Rev = c(3, 0, 0, 1, 0, 0, 2, 1, 1, 2, 2, 1, 2, 1), L.Qty = c(3,
0, 0, 1, 0, 0, 1, 1, 1, 2, 2, 1, 2, 1), A.Rev = c(0, 0, 0, 1,
1, 1, 0, 0, 0, 0, 0, 1, 0, 0), A.Qty = c(0, 0, 0, 2, 2, 3, 0,
0, 0, 0, 0, 3, 0, 0), I.Rev = c(4, 4, 4, 0, 1, 0, 3, 0, 0, 0,
1, 0, 1, 1), I.Qty = c(2, 2, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 1,
1)), .Names = c("Zone", "Fiscal.Year", "Transaction.ID", "L.Rev",
"L.Qty", "A.Rev", "A.Qty", "I.Rev", "I.Qty"), row.names = c(NA,
14L), class = "data.frame")
出力形式: 出力を生成するコードは次のとおりです。とを 1 つの Excel ファイルに 2 枚のシートとして、 と、とを 1 つの Excel ファイルに 3 枚のシートとして表示したいEastList.2016
と思います。EastList.2017
WestList.2016
WestList.2017
WestList.2018
#generate the output:
EastList.2016 <- EastList[[1]]
EastList.2017 <- EastList[[2]]
WestList.2016 <- WestList[[1]]
WestList.2017 <- WestList[[2]]
WestList.2018 <- WestList[[3]]