3

data というデータフレームがあります。KEYという属性で分割関数を使用してデータを分割しています。

data <- split(data, data$KEY);   

データフレームを KEY で分割すると、個々の企業のデータが得られます。データフレーム データには、ユニバース内のすべての企業のデータが含まれていました。分割後、個々の分割には年と売上の 2 つの列があります。分割ごとに、各年に対応する増分売上を計算する必要があります。たとえば、2002 年 - 10、2003 年 - 12、2004 年 - 15、2005 年 - 20 のデータがあるとします。取得したいのは、分割ごとに 2003 年 -2、2004 年 -3、2005 年 - 5 です。上記のジョブを実行するために、mod_sale という関数を作成しました。

data[with(data, order(year)),];
sale_data <- diff(data$SALE);
data <- data[-1,];
data$SALE <- sale_data;
return(data)

現在、forループを使用しています:

for(key in names(data)){
a <- try(mod_sale(data[[key]]))
if(class(a) == "try-error") next;
mod_data <- rbind(mod_data,a)};

いくつかの方法があると思います。sapply を使用できます (plyr も使用できます)。誰かがこの R コードの改善を手伝ってくれますか? sapply コードがどのように機能するかはわかりません。

sapply(data, mod_sale)

どんな助けでも大歓迎です。ありがとう。

編集:

以下はデータの例です。

a <- data.frame();
key <- c(1,1,1,1,2,2,2,2,2,3,3,3);
sales <- c(12,12,15,8,3,6,3,9,9,12,3,7);
year <- c(2002,2003,2004,2005,2001,2002,2003,2004,2005,2003,2004,2005);
ovar <- runif(12,5.0,7.5);
a <- data.frame(key,sales,year,ovar)

結果の data.frame では、実際の売上ではなく増分売上を期待しています。明らかに、3 つのキーに対して 3 つのデータ ポイントが失われます。違いを取っているので、開始年ごとに1つ。したがって、結果の data.frame には 3 つの行が少なくなり、key、diff(sales)、year、および ovar の列が含まれます。

4

3 に答える 3

2

これは私がやったことです:

a$diffsales <- ave( a$sales, a$key, FUN=function(x) c(NA, diff(x) ) )
a
   key sales year     ovar diffsales
1    1    12 2002 6.845177        NA
2    1    12 2003 6.328153         0
3    1    15 2004 6.872669         3
4    1     8 2005 6.098920        -7
5    2     3 2001 7.154824        NA
6    2     6 2002 6.110810         3
7    2     3 2003 5.906624        -3
8    2     9 2004 5.214369         6
9    2     9 2005 5.818218         0
10   3    12 2003 5.354354        NA
11   3     3 2004 6.728992        -9
12   3     7 2005 7.412213         4
于 2013-11-08T22:29:21.690 に答える
1

使用data.table:

library(data.table)
dt = data.table(a)

dt[, sale_diff := c(NA, diff(sales)), by = key]
dt
#    key sales year     ovar sale_diff
# 1:   1    12 2002 7.416857        NA
# 2:   1    12 2003 5.625818         0
# 3:   1    15 2004 5.018934         3
# 4:   1     8 2005 6.671986        -7
# 5:   2     3 2001 6.242739        NA
# 6:   2     6 2002 6.297763         3
# 7:   2     3 2003 6.482124        -3
# 8:   2     9 2004 6.724256         6
# 9:   2     9 2005 5.071265         0
#10:   3    12 2003 6.136681        NA
#11:   3     3 2004 6.974392        -9
#12:   3     7 2005 6.517553         4
于 2013-11-08T22:31:43.643 に答える