0

売上高のカテゴリ変数を持つデータ フレームで、いくつかの基本的な統計 (および後で詳細な統計) を実行しようとしています。売上に加えて、地域 (商人がいる場所)、曜日、時間帯 (昼食、仕事の後など)、その他さまざまなことを追跡します。

以下は、データの小さなランダムなサブセットです: (これは基本的な表現であることに注意してください。実際のデータ フレームには 38 列あります。該当しないもののほとんどを取り除いただけです)。

    structure(list(dayofweek = structure(c(4L, 7L, 3L, 7L, 3L, 2L, 
2L, 7L, 3L, 3L, 2L, 7L, 5L, 5L, 2L, 5L, 1L, 3L, 7L, 3L, 4L, 1L, 
3L, 5L, 7L), .Label = c("Friday", "Monday", "Saturday", "Sunday", 
    "Thursday", "Tuesday", "Wednesday"), class = "factor"), timeofday = structure(c(6L, 
4L, 5L, 5L, 2L, 6L, 6L, 5L, 6L, 3L, 6L, 3L, 5L, 4L, 1L, 3L, 5L, 
6L, 5L, 4L, 6L, 6L, 3L, 2L, 5L), .Label = c("After Work", "Early AM", 
     "Evening", "Late AM", "Lunch", "MidAfternoon", "Overnight"), class = "factor"), 
 area = c(6L, 4L, 4L, 5L, 5L, 1L, 4L, 2L, 3L, 2L, 7L, 3L, 
 7L, 5L, 7L, 4L, 1L, 4L, 1L, 4L, 5L, 7L, 1L, 3L, 7L), totsales = c(40, 
 6, 5, 10, 1, 0, 0, 3, 5, 3, 10, 30, 2, 1, 2, 22, 8, 1, 1, 
 5, 11, 20, 0, 1, 5)), .Names = c("dayofweek", "timeofday", 
     "area", "totsales"), class = "data.frame", row.names = c(192278L, 
     140773L, 121051L, 157984L, 154299L, 258034L, 108031L, 43760L, 
     78005L, 42103L, 95603L, 98431L, 30252L, 165303L, 40713L, 108252L, 
     304549L, 137041L, 268473L, 124599L, 161253L, 12897L, 240815L, 
     89439L, 21032L))

私が最初にやっていることは、各地域と 1 日の各時間帯の平均と中央値の売上を得ようとすることです。Rにそれぞれのリストを調べて、すべての値を返すようにしたいと思います。私はこれを試しました:

vallist<-list(a= c("Early AM", "Late AM", "Lunch", "MidAfternoon", "After Work", 
         "Evening", "Overnight"),
          b= c(1,2,3,4,5,6,7))

sapply(vallist[['b']], function(x)
    mapply(function(a,b) mean(data$totsales[which(data$timeofday==a & data$area==b)]),
          vallist[['a']], vallist[['b']])
 )

ただし、平均はエリア 1 の各時刻セグメントにのみ適用され、エリア 1 ~ 7 の各時刻セグメントには適用されません。したがって、私の結果は次のようになります。

                  [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
Early AM      9.192847  9.192847  9.192847  9.192847  9.192847  9.192847  9.192847
Late AM       8.020678  8.020678  8.020678  8.020678  8.020678  8.020678  8.020678
Lunch        10.096277 10.096277 10.096277 10.096277 10.096277 10.096277 10.096277
MidAfternoon 11.503961 11.503961 11.503961 11.503961 11.503961 11.503961 11.503961
After Work    8.206124  8.206124  8.206124  8.206124  8.206124  8.206124  8.206124
Evening      11.457599 11.457599 11.457599 11.457599 11.457599 11.457599 11.457599
Overnight    11.415667 11.415667 11.415667 11.415667 11.415667 11.415667 11.415667

これはエリア 1 の正解ですが、各エリアで同じ値であることがわかります。R に関数を複数のリストに適用させ、値のすべての組み合わせを返すようにするにはどうすればよいですか?

次のステップは、中央値を適用し、地区レベルで異なる平日について評価することですが、同じ考えがすべての異なる組み合わせに適用されると思います.

4

2 に答える 2

1

この特定のケースでは、次の方法で結果を再現できます。

library(reshape2)
dcast(data[-1], timeofday ~ area, fun.aggregate=mean, fill=0)

これは以下を生成します:

     timeofday   1 2  3    4  5  6    7
1   After Work 0.0 0  0  0.0  0  0  2.0
2     Early AM 0.0 0  1  0.0  1  0  0.0
3      Evening 0.0 3 30 22.0  0  0  0.0
4      Late AM 0.0 0  0  5.5  1  0  0.0
5        Lunch 4.5 3  0  5.0 10  0  3.5
6 MidAfternoon 0.0 0  5  0.5 11 40 15.0

あなたの結果との食い違いは、あなたが投稿したデータが全体のサブセットであるためだと確信しています。

于 2014-03-03T17:09:07.443 に答える
0

私のコメントを回答に変換しています....

興味があるようですaggregate(ただし、R でデータを集計する方法はたくさんあります)。

out <- aggregate(totsales ~ timeofday + area, data, mean)
out
#       timeofday area totsales
# 1       Evening    1      0.0
# 2         Lunch    1      4.5
# 3  MidAfternoon    1      0.0
# 4       Evening    2      3.0
# 5         Lunch    2      3.0
# 6      Early AM    3      1.0
# 7       Evening    3     30.0
# 8  MidAfternoon    3      5.0
# 9       Evening    4     22.0
# 10      Late AM    4      5.5
# 11        Lunch    4      5.0
# 12 MidAfternoon    4      0.5
# 13     Early AM    5      1.0
# 14      Late AM    5      1.0
# 15        Lunch    5     10.0
# 16 MidAfternoon    5     11.0
# 17 MidAfternoon    6     40.0
# 18   After Work    7      2.0
# 19        Lunch    7      3.5
# 20 MidAfternoon    7     15.0

そこからワイド フォーマットに移行する場合は、reshape(like: reshape(out, direction = "wide", idvar="timeofday", timevar="area")) を使用できます。

于 2014-03-03T17:20:33.343 に答える