2016-04-22 71 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)'的向量。第一個分割「x」是'c(10L,20L,30L)','diff(x)'是'c(10L,10L)' 'head(x,1)'是'c(10L, 20L)'。劃分他們給你增加。我添加了「NA」,因爲第一個值沒有增加。 – lukeA

+0

太棒了!謝謝。 – noblabla