2014-11-25 53 views
8

我有一组时间序列,我想在特定的时间间隔内相对于它们的值对它们进行缩放。那样,每个系列在当时都会达到1.0,并且按比例变化。相对于每个组中的值的比例(通过dplyr)

我不知道如何用dplyr做到这一点。

下面是使用一个for循环的工作示例:

library(dplyr) 

data = expand.grid(
    category = LETTERS[1:3], 
    year = 2000:2005) 
data$value = runif(nrow(data)) 

# the first time point in the series 
baseYear = 2002 

# for each category, divide all the values by the category's value in the base year 
for(category in as.character(levels(factor(data$category)))) { 
    data[data$category == category,]$value = data[data$category == category,]$value/data[data$category == category & data$year == baseYear,]$value[[1]] 
} 

编辑:修饰的问题,使得基准时间点不是可转位。有时候,“时间”栏实际上是一个因素,不一定是序数。

回答

5

该解决方案是非常相似的@thelatemail,但我认为它有足够的不同,可以有自己的答案因为它根据条件选择索引:

data %>% group_by(category) %>% mutate(value = value/value[year == baseYear]) 
# category year  value 
#...  ... ...  ... 
#7   A 2002 1.00000000 
#8   B 2002 1.00000000 
#9   C 2002 1.00000000 
#10  A 2003 0.86462789 
#11  B 2003 1.07217943 
#12  C 2003 0.82209897 

(数据输出已被截断。要复制这些结果,创建data时需要set.seed(123)。)

2

事情是这样的:

data %>% 
    group_by(category) %>% 
    mutate(value=value/value[1]) %>% 
    arrange(category,year) 

结果:

# category year  value 
#1   A 2000 1.0000000 
#2   A 2001 0.2882984 
#3   A 2002 1.5224308 
#4   A 2003 0.8369343 
#5   A 2004 2.0868684 
#6   A 2005 0.2196814 
#7   B 2000 1.0000000 
#8   B 2001 0.5952027 
+0

另一种方法是使用'first'和'order_by'。通过使用'order_by',每个类别的最低年份应该在第一行。 'mutate(group_by(data,category),out = order_by(year,value/first(value)))%>%arrange(category)' – jazzurro 2014-11-25 02:00:35

+0

Thanks!如果我想按照年份中位数进行缩放,那么索引不起作用会怎样? – sharoz 2014-11-25 02:02:29

+0

@sharoz你的意思是'mutate(value = value/median(year))' – 2014-11-25 11:34:12

6

使用first在dplyr,确保您使用order_by

data %>% 
    group_by(category) %>% 
    mutate(value = value/first(value, order_by = year)) 
+0

谢谢!如果我想按中位数进行缩放,或者索引不起作用的情况会怎样? – sharoz 2014-11-25 02:24:50

+0

'mutate(valute = value/median(value))'使用'group_by'来选择中位数应接管的子集。 – Hugh 2014-11-25 02:35:26

+0

这就是媒体价值。我在问,如果它按照年份中值(或特定年份)的值进行缩放。 – sharoz 2014-11-25 03:01:15