2016-05-29 6 views
0

のは、私はこのようなデータフレームを持っているとしましょう:R:列間の差異の割合を調べ、それに応じて名前を付ける方法は?

> df = data.frame(id = c(2,88,4), sale1 = c(100,200,50), sale2 = c(50,150,50), sale3 = c(60, 100, 75)) 
> df 
    id sale1 sale2 sale3 
1 2 100 50 60 
2 88 200 150 100 
3 4 50 50 75 

、iは各アイテムIDの各2つの営業季節間のパーセント差を見つけたいです。 ように基本的に:

[sale_n + 1] - [sale_n])/ [sale_n] N =営業列インデックス

各行、および私はすべての列を横切っていることをやってみたいですdiffを新しいテーブルに配置します。

最終結果テーブルには、元のデータフレーム内のN個の列の数(id列以外)の "id"列とN-1列が含まれます。例えば

iは、上記得られたDFと、所望の出力は、(ID列以外のすべての値は百分率である)であろう:

> df_diff 
    id sale12 sale23 
1 2 -50  20 
2 88 -25 -33 
3 4  0  50 

Iは、以下のような記事を読んだ:

  1. How to calculate percentage change from different rows over different spans
  2. Calculate percentage change in an R data frame

けどsolut 1で提供されるイオンは(私は非常に多くの列を持っているので)縮尺されておらず、2(lag()を使用しています)は行ごとに違いがあるようです。

ヘルプ(ヒント、ポインタ、リダイレクト)をいただければ幸いです!あなたが私にスマートに応じて新しい結果表の列に名前を付ける方法を教えることができれば

エンドノート

も大幅にいただければ幸いです。 (この例では)列の名前に「sales12」と「sale23」と入力します。

答えて

3

lapplyの呼び出しでsetNamesを使用できます。最初のsales列を使用してパーセント値、3列目を計算し、sales列の最後までループスルーします。私は、彼らがここで適切であったので、列に名前を付けるために、X-2およびX-1を使用しますが、それはnの値に依存します:

d <- df["id"] 

n <- 3L # column where your first percent can be calculated 
d[,2:length((n-1):dim(df)[2])] <- 
    lapply(n:dim(df)[2], function(x) setNames(((df[x] - df[x-1])/df[x-1]), 
               paste0("sales", x-2, x-1))) 
# id sales12 sales23 
#1 2 -0.50 0.2000000 
#2 88 -0.25 -0.3333333 
#3 4 0.00 0.5000000 
+0

が、これはまた、パーセントの差分を計算していますか?私はあなたが数式をsetNames()関数の中に入れていることを知っています。どうして? – alwaysaskingquestions

+0

数式で100を掛けてパーセントを得ることができます。 'setNames'の最初の引数は、式の結果である名前を付けるものです。 – Jota

+0

なぜ私の質問は、式がsetNames()関数の中にあるのですか?なぜこの作品が...数式をsetNames()の外に置くべきでないのか理解していないのですか?計算した後、名前を設定しますしかし、私はあなたのコードをテストした、それは動作します!私は構文について混乱しているだけです。ありがとうございました! – alwaysaskingquestions

関連する問題