如果有人可以帮我解决这个问题,我将非常感激。这看起来很简单,但我不知道如何去做。
我正在尝试计算相对于前一行的百分比变化。例如:我的数据框如下所示:
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%的日子
非常感谢
答案 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