0

SQL を使用してデータを取得しSQL Server、.NET で処理していRます。どちらかを使用して問題を解決できます。

ここに私のデータがあります:

structure(list(id = c(1, 2, 3, 1, 2), FY = c(2010, 2008, 2009, 2011, 2009), sales = c(100, 200, 300, 400, 500)), .Names = c("id", "FY", "sales"), row.names = c(NA, -5L), class = "data.frame")

私はそれをテストと呼んだ

 id FY   sales
 1 2010   100
 2 2008   200
 3 2009   300
 1 2011   400
 2 2009   500

編集: 私が見つけたいのは、2008 年と 2009 年に購入した顧客の維持率です。2009 年と 2010 年に購入した人。2010年と2011年に購入した人。

最終結果グリッドは、顧客が翌年維持された年に 1 または null 以外の値を配置します。

私が取得しようとしている最終結果は次のようになります。

id 2008 2009 2010 2011
1               1     
2     1     

このタイプの表を使用して、毎年の定着率を計算できます。

現在、さまざまなCASEステートメントとサブクエリを記述してこのようなグリッドを作成できますが、実際のデータを 10 年以上使用しており、何年にもわたってハード コードするのは嫌です。Rおそらく、データがになったら、これを行う方が簡単ですがcast、これをコーディングするのに苦労しています。

4

3 に答える 3

3
tbl <- xtabs( ~ id+FY, data=test)  #......
tbl

これが正の売上であり、連続した年が 1 である売上が必要です。

 0+( tbl[ , -1]==1 & tbl[,-ncol(tbl)]==1)
#-------
   FY
id  2009 2010 2011
  1    0    0    1
  2    1    0    0
  3    0    0    0

論理演算は TRUE と FALSE のマトリックスを生成し、論理に 0 を追加すると 0/1 に変換されます。この結果の違いに気づき、より受け入れられると思います。あなたのラベル付けは、私たちが将来を見通すことができることを示唆しているかもしれません. 同意しない場合は、列ラベルが最初の引数から取得されるため、revise を使用できます。

0+( tbl[,-ncol(tbl)]==1 &tbl[ , -1]==1)
于 2013-06-11T18:35:02.073 に答える
0

以下は、(集計を使用して) ピボットを実行する 1 つの方法です。

select id,
       p2008 * p2009 as [2008],
       p2009 * p2010 as [2009],
       p2010 * p2011 as [2010],
       p2011 * p2012 as [2011]
from (select t.*,
             (case when FY = 2008 then 1 end) as p2008,
             (case when FY = 2009 then 1 end) as p2009,
             (case when FY = 2010 then 1 end) as p2010,
             (case when FY = 2011 then 1 end) as p2011,
             (case when FY = 2012 then 1 end) as p2012
      from test t
     ) t
group by id

このような保持分析に興味がある場合は、生存分析、特に再発イベント分析について学ぶ必要があります。

于 2013-06-11T19:04:20.240 に答える