r中的顺序减法

时间:2014-05-14 14:21:40

标签: r subtraction seq

如果有人可以帮我解决这个问题,我将非常感激。这看起来很简单,但我不知道如何去做。

我正在尝试计算相对于前一行的百分比变化。例如:我的数据框如下所示:

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%的日子

非常感谢

5 个答案:

答案 0 :(得分:8)

您正在寻找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 :(得分:1)

使用diff

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

答案 2 :(得分:1)

您正在寻找diff功能:

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

答案 3 :(得分: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

答案 4 :(得分: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