2016-03-20 31 views
4
  • []行が変更されている間、 '2つの行の間の変化の割合'を計算するのが好きです。項目の最初の行のために
  • 、私はいくつかのテキストまたは空白 配置しても大丈夫だ(「スキップ」例をまたは空白はOKです)ので、同じ 項目の前の行の無い比較のR 2行の間の '変化率'を計算する方法は?

    df <- data.frame(period=rep(1:4,2), 
          farm=c(rep('A',4),rep('B',4)), 
          cumVol=c(1,5,15,31,10,12,16,24), item=c(rep('Z',3),rep('Y',3),rep('X',2)), 
          other = 1:8); 
    

'Percentage_Change'カラム(データセットへの追加カラム)の必要な出力は以下のようになります。 (式:100 /前の項目列値*現在の行項目の値...第二row..100/1 * 5 = 500例)すべてのあなたの助けを

Row Percentage_Change 
1 Skip 
2 500 
3 300 
4 Skip 
5 32.25806452 
6 120 
7 Skip 
8 150 

感謝。

+0

テキストまたは空白またはゼロのない最初の行をスキップしてもよろしいですか – Murali

+0

5番目の値を確認できますか? – akrun

+0

5番目の値が間違っています。それは32.25と仮定します。 100%を超えてしか計算していないようです。 – Murali

答えて

2

shiftからdata.tableまでを使用できます。 'data.frame'を 'item'でグループ化した 'data.table'(setDt(df))に変換し、.Iから「Row」を取得し、「cumVol」を「cumVol」のlagで割って「Percentage_Change」を作成します。 (shiftを取得して)100を掛けます。必要に応じて、(:=)をNULLに割り当てることでグループ化列を削除できます。

library(data.table) 
setDT(df)[, list(Row = .I, Percentage_Change=round(cumVol* 
    (100/shift(cumVol)),2)), .(item)][, item := list(NULL)][] 
# Row Percentage_Change 
#1: 1    NA 
#2: 2   500.00 
#3: 3   300.00 
#4: 4    NA 
#5: 5   32.26 
#6: 6   120.00 
#7: 7    NA 
#8: 8   150.00 

注:これは、代わりにSkipのない比較は、存在しない要素のためのNAを与えます。

+0

ありがとう。あなたは素敵だ!!!!それは魅力のように働いた! – Murali

+0

@ Akrun..5番目の値で私を助けてくれますか?私はその価値を見落としました。 – Murali

+1

@ムラリ変更されました。 – akrun

2

dplyrで同じことができます。これは完全にakrunの答えに似ていますが、他の構文を使用しています。

library(dplyr) 
mutate(df, Row = 1:n()) %>% 
    group_by(item) %>% 
    mutate(Percentage_Change = cumVol/lag(cumVol) * 100) %>% 
    ungroup %>% 
    select(Row, Percentage_Change) 
## Source: local data frame [8 x 2] 
## 
##  Row Percentage_Change 
## (int)    (dbl) 
## 1  1    NA 
## 2  2   500.00000 
## 3  3   300.00000 
## 4  4    NA 
## 5  5   32.25806 
## 6  6   120.00000 
## 7  7    NA 
## 8  8   150.00000 
関連する問題