データフレーム内のすべての一意の変数名(コークスやペプシなどのブランド)の変数(売上や単位など)を合計する方法はありますか?参考までに、ここにいくつかのサンプルデータがあります。
set.seed(123)
period <- seq(as.Date('2021/01/01'), as.Date('2021/01/07'), by="day")
Coke_Regular_Units <- sample(1000:2000, 7, replace = TRUE)
Coke_Diet_Units <- sample(1000:2000, 7, replace = TRUE)
Coke_Regular_Sales <- sample(500:1000,7, replace = TRUE)
Coke_Diet_Sales <- sample(500:1000, 7, replace = TRUE)
Pepsi_Regular_Units <- sample(1000:2000, 7, replace = TRUE)
Pepsi_Diet_Units <- sample(1000:2000, 7, replace = TRUE)
Pepsi_Regular_Sales <- sample(500:1000, 7, replace = TRUE)
Pepsi_Diet_Sales <- sample(500:1000, 7, replace = TRUE)
df <- data.frame(Coke_Regular_Units, Coke_Diet_Units, Coke_Regular_Sales, Coke_Diet_Sales,
Pepsi_Regular_Units, Pepsi_Diet_Units, Pepsi_Regular_Sales, Pepsi_Diet_Sales)
> head(df)
period Coke_Regular_Units Coke_Diet_Units Coke_Regular_Sales Coke_Diet_Sales Pepsi_Regular_Units
1 2021-01-01 1414 1117 589 847 1425
2 2021-01-02 1462 1298 590 636 1648
3 2021-01-03 1178 1228 755 976 1765
4 2021-01-04 1525 1243 696 854 1210
5 2021-01-05 1194 1013 998 827 1931
6 2021-01-06 1937 1373 590 525 1589
Pepsi_Diet_Units Pepsi_Regular_Sales Pepsi_Diet_Sales
1 1554 608 943
2 1870 762 808
3 1372 892 634
4 1843 924 808
5 1142 829 910
6 1543 522 723
Coke_Sales、Coke_Units、Pepsi_Sales、Pepsi_Units、Regular_Sales、Diet_Unitsを自動的に計算するコードが好きです。
私は現在、変数ごとにこのようにしています
library(dplyr)
df$Coke_Sales <- rowSums(Filter(is.numeric, select(df, (matches("Coke") & matches("Sales")))))
df$Coke_Units <- rowSums(Filter(is.numeric, select(df, (matches("Coke") & matches("Units")))))
これは少数の変数では問題ありませんが、数百の変数でこれを行う必要があります。これを可能にする機能はありますか?Coke、Pepsi、Diet、Regularなどの一意の変数名を自動的に見つける必要があります。メトリックは変数名の最後の部分であるため、必ずしもこれを自動検索する必要はありませんが、すばらしいでしょう。簡単にできる場合は、最大で3つのメトリックしかないため、メトリックを指定してもかまいませんが、ブランドは数百あります。
自動化できない場合は、必要な変数を指定して簡略化できる方法はありますか。完璧ではありませんが、それでも改善されています。たとえば、これらのコード行を含めて、合計する変数と必要なメトリックを指定します。
VarsToSum <- c("Coke", "Pepsi", "Diet", "Regular")
Metrics <- c("Sales", "Units")
それがそのように達成できない場合、多分私はより小さなステップに分割する必要があります、どんなヒントも素晴らしいでしょう。その方法を考えようとすると、接頭辞「_」の前にある一意の名前を見つけて、それらの一意の名前の「Sales」と「Units」を計算する必要があります。これが最善の方法でしょうか?または、データの形状を変更する必要がありますか?そこに行くための他のルートはありますか?
これを達成するための助けや指示をいただければ幸いです。ありがとう
ここにdata.table
アプローチがあります...
library( data.table )
setDT(df) #make it a data.table
#melt to long
ans <- melt( df, id.vars = "period", variable.factor = FALSE )
#split variable to 3 new columns
ans[, c("brand", "type", "what") := tstrsplit( variable, "_" ) ]
# > head(ans)
# period variable value brand type what
# 1: 2021-01-01 Coke_Regular_Units 1414 Coke Regular Units
# 2: 2021-01-02 Coke_Regular_Units 1462 Coke Regular Units
# 3: 2021-01-03 Coke_Regular_Units 1178 Coke Regular Units
# 4: 2021-01-04 Coke_Regular_Units 1525 Coke Regular Units
# 5: 2021-01-05 Coke_Regular_Units 1194 Coke Regular Units
# 6: 2021-01-06 Coke_Regular_Units 1937 Coke Regular Units
#summarise however you like
ans[, .(total = sum(value) ), by = .(brand, type, what)]
# brand type what total
# 1: Coke Regular Units 10527
# 2: Coke Diet Units 8936
# 3: Coke Regular Sales 5158
# 4: Coke Diet Sales 5171
# 5: Pepsi Regular Units 11160
# 6: Pepsi Diet Units 10813
# 7: Pepsi Regular Sales 5447
# 8: Pepsi Diet Sales 5491
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加