Finding Growth in Dataframe in R

前端 未结 2 1037
忘了有多久
忘了有多久 2021-01-03 05:21

Suppose I have the following data frame

Website <- rep(paste(\"Website\",1:3),2)
Year <- c(rep(2013,3),rep(2014,3))
V1 <- c(10,20,50,20,30,70)
V2 &l         


        
相关标签:
2条回答
  • 2021-01-03 05:51

    A data.table option (I am using data.table_1.9.5 that introduced the function shift). Assuming that the year column is "ordered", convert the "data.frame" to "data.table" using setDT, loop through the columns ("V1", "V2") with lapply (specify the columns in .SDcols) and do the calculation for individual columns (x/shift(x)...). The default setting for shift is type='lag' and n=1L. If you want to remove the NA rows, you can use na.omit which is also fast in the devel version.

    library(data.table)
    na.omit(setDT(df)[, lapply(.SD, function(x)
                  x/shift(x) - 1), by=Website, .SDcols=3:4])
    #     Website  V1  V2
    #1: Website 1 1.0 2.0
    #2: Website 2 0.5 1.0
    #3: Website 3 0.4 0.5
    
    0 讨论(0)
  • 2021-01-03 06:09

    Assuming that you have more years, dplyr handles it beautifully.

    library(dplyr)
    growth <- function(x)x/lag(x)-1
    df %>% 
      group_by(Website) %>% 
      mutate_each(funs(growth), V1, V2)
    #    Website Year  V1  V2
    #1 Website 1 2013  NA  NA
    #2 Website 2 2013  NA  NA
    #3 Website 3 2013  NA  NA
    #4 Website 1 2014 1.0 2.0
    #5 Website 2 2014 0.5 1.0
    #6 Website 3 2014 0.4 0.5
    
    0 讨论(0)
提交回复
热议问题