寻找R中数据框架的增长

时间:2015-01-16 23:50:19

标签: r

假设我有以下数据框

Website <- rep(paste("Website",1:3),2)
Year <- c(rep(2013,3),rep(2014,3))
V1 <- c(10,20,50,20,30,70)
V2 <- c(5,15,30,15,30,45)
df <- data.frame(Website,Year,V1,V2)
df


    Website Year V1 V2
1 Website 1 2013 10  5
2 Website 2 2013 20 15
3 Website 3 2013 50 30
4 Website 1 2014 20 15
5 Website 2 2014 30 30
6 Website 3 2014 70 45

我想要找到的是每个website20132014的增长,即两个变量的(x1 - x0)/ x0。这将导致数据框执行以下操作

    Website  V1  V2
1 Website 1 1.0 2.0
2 Website 2 0.5 1.0
3 Website 3 0.4 0.5

这只是WebsiteV1变量的每个V2的增长率。

2 个答案:

答案 0 :(得分:10)

假设你有更多年,dplyr处理得很漂亮。

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

答案 1 :(得分:3)

data.table选项(我使用data.table_1.9.5引入了函数shift)。假设年份列是“有序”的,使用setDT将“data.frame”转换为“data.table”,使用lapply循环遍历列(“V1”,“V2”)(指定.SDcols中的列并对各列进行计算(x/shift(x)...)。 shift的默认设置为type='lag'n=1L。如果要删除NA行,可以使用na.omit,它在devel版本中也很快。

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