2014-05-14 77 views
1

如果有人能幫我解決這個問題,我將非常感激。這看起來很簡單,但我不知道如何去做。r中的連續減法

我正在努力計算一行中的百分比變化與前一個相比。例如:我的數據幀是這樣的:

day   value 

1   21 
2   23.4 
3   10.7 
4   5.6 
5   3.2 
6   35.2 
7   12.9 
8   67.8 
.   . 
.   . 
.   . 
365   27.2 

我所試圖做的是相對於前一行來計算每一行中的百分比變化。例如:

day    value 

1     21 
2   (day2-day1/day1)*100 
3   (day3-day2/day2)*100 
4   (day4-day3/day3)*100 
5   (day5-day4/day4)*100 
6   (day6-day5/day5)*100 
7   (day7-day6/day6)*100 
8   (day8-day7/day7)*100 
.     . 
.     . 
.     . 
365  (day365-day364/day364)*100 

,然後打印出來只有那些天,其中有從以前行的> 50%的比例增長

非常感謝

回答

6

您正在尋找diff()。輸入?diff以查看幫助頁面。以下是天即滿足您的條件指數:

> value <- c(21,23.4,10.7,5.6,3.2,35.2,12.9,67.8) 
> which(diff(value)/head(value,-1)>0.5)+1 
[1] 6 8 
1

使用diff

value <- 100*diff(value)/value[2:length(value)] 
0

您要找的diff功能:

x<-c(3,1,4,1,5) 
diff(x) 
[1] -2 3 -3 4 
1

這裏有一種方法:

dat <- data.frame(day = 1:10, value = 1:10) 

dat2 <- transform(dat, value2 = c(value[1], diff(value)/head(value, -1) * 100)) 
    day value value2 
1 1  1 1.00000 
2 2  2 100.00000 
3 3  3 50.00000 
4 4  4 33.33333 
5 5  5 25.00000 
6 6  6 20.00000 
7 7  7 16.66667 
8 8  8 14.28571 
9 9  9 12.50000 
10 10 10 11.11111 

dat2[dat2$value2 > 50, ] 
    day value value2 
2 2  2 100 
0

這裏是另一種方式:

#dummy data 
df <- read.table(text="day   value 
1   21 
2   23.4 
3   10.7 
4   5.6 
5   3.2 
6   35.2 
7   12.9 
8   67.8", header=TRUE) 

#get index for 50% change 
x <- sapply(2:nrow(df),function(i)((df$value[i]-df$value[i-1])/df$value[i-1])>0.5) 

#output 
df[c(FALSE,x),] 
# day value 
#6 6 35.2 
#8 8 67.8