2016-04-22 13 views
1

Aにソートされたデータフレームがあり、同じIDごとにx2の増加を計算したいと思います。 は、入力は、すでに特定の方法でソートされます。同じIDごとに行間の増加を計算します

ID x2 x3 x4 
1 10 11 2 
2 100 12 4 
1 20 13 10 
7 24 3 1 
1 30 14 0 
3  6 15 1 
2 90 15 1 

私が取得したいと思います:

ID x2 increase x3 x4 
1 10   11 2 
2 100   12 4 
1 20  +100% 13 10 
7 24    3 1 
1 30  +50% 14 0 
3  6   15 1 
2 90  -10% 15 1 

答えて

2

あなたは

df <- read.table(header=T, text=" 
ID x2 x3 x4 
1 10 11 2 
2 100 12 4 
1 20 13 10 
7 24 3 1 
1 30 14 0 
3  6 15 1 
2 90 15 1") 
df$increase <- ave(df$x2, df$ID, FUN = function(x) c(NA, diff(x)/head(x, -1))*100) 
df$increase <- ifelse(is.na(df$increase), "", sprintf("%+.0f%%", df$increase)) 
df 
# ID x2 x3 x4 increase 
# 1 1 10 11 2   
# 2 2 100 12 4   
# 3 1 20 13 10 +100% 
# 4 7 24 3 1   
# 5 1 30 14 0  +50% 
# 6 3 6 15 1   
# 7 2 90 15 1  -10% 
+0

を行うことができますが、この命令 'のdf $についての説明を与えることができますあなたの答えに< - ave(df $ x2、df $ ID、FUN = function(x)c(NA、diff(x)/ head(x、-1))* 100) – noblabla

+0

'ave'はあなたのデータを' df $ ID'で分割し、長さ 'nrow(df)'のベクトルを返します。 'diff(x)'は 'c(10L、10L)'で であり、 'head(x、1)'は 'c(10L、20L、30L) 20L)。それらを分割することであなたの増加をもたらします。第1の値が増加しないので、「NA」を追加しています。 – lukeA

+0

驚くばかり!ありがとうございました。 – noblabla

関連する問題