【问题标题】:sequential subtraction in rr中的顺序减法
【发布时间】:2014-05-14 14:21:40
【问题描述】:

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

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

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

非常感谢

【问题讨论】:

    标签: r subtraction seq


    【解决方案1】:

    您正在寻找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
    

    【讨论】:

      【解决方案2】:

      使用diff:

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

      【讨论】:

        【解决方案3】:

        这是一种方法:

        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】:

          您正在寻找diff函数:

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

          【讨论】:

            【解决方案5】:

            这是另一种方式:

            #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
            

            【讨论】:

              猜你喜欢
              • 2016-12-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-27
              • 1970-01-01
              • 2014-09-13
              • 1970-01-01
              • 2018-09-06
              相关资源
              最近更新 更多