如何将更改率计算添加到data.frame和组ID

时间:2017-07-13 21:28:06

标签: r

我使用plyr计算了数千个ID的年平均值,但现在我无法确定如何有效地计算变化率。 例如:

ID  Year  Mean
1A  1994  1
1A  1995  2
1A  1997  4
1B  2000  3
1B  2012  4
1B  2013  5

我可以使用带有lm()的循环来有效地计算每个ID的变化率吗?

我也尝试过使用diff(),但我无法弄清楚如何一次性计算每个ID的变化率。

我还想弄清楚如何将其添加为data.frame的新列。我有一个宽格式的表格,每年都占据它自己的列和按年份和ID列出的相应方法,但你能计算出来自广播表的变化率吗? 谢谢。

3 个答案:

答案 0 :(得分:2)

diff函数返回一个比它输入短1个元素的向量(不能计算第一个观察的差异)。计算失败,因为矢量长度不匹配。至于分组问题,使用ifelse和滞后函数有条件地使每个ID的第一种情况无效。请参阅以下功能:

df <- data.frame(ID = c("1A", "1A", "1A", "1B", "1B", "1B"),
                 Year = c(1994, 1995, 1997, 2000, 2012, 2013),
                 Mean = c(1, 2, 4, 3, 4, 5),
                 stringsAsFactors = FALSE)

delta <- function(x) diff(c(NA, x))      # inserts an NA value at the beginning
prior <- function(x) c(NA, head(x, -1))  # lagging function using base R    
rate  <- function(x) delta(x) / prior(x) # for readability

df$growth_rate <- ifelse(df$ID == prior(df$ID), rate(df$Mean), NA)

df

结果

  ID Year Mean growth_rate
1 1A 1994    1          NA
2 1A 1995    2   1.0000000
3 1A 1997    4   1.0000000
4 1B 2000    3          NA
5 1B 2012    4   0.3333333
6 1B 2013    5   0.2500000

答案 1 :(得分:0)

在这些情况下,常见的方法是使用ave进行基础R的分组。

df$growth <- with(df, ave(Mean, ID,
                          FUN=function(x) c(NA, diff(x) / tail(x, -1))))

返回

df
  ID Year Mean growth
1 1A 1994    1     NA
2 1A 1995    2   0.50
3 1A 1997    4   0.50
4 1B 2000    3     NA
5 1B 2012    4   0.25
6 1B 2013    5   0.20

答案 2 :(得分:0)

如果这对任何人都有帮助,这是我使用宽格式data.frame获取数据的最终解决方案:

result.tab <-data.frame(ID=df$ID, coff=NaN, rsq=NaN, Pvalue=NaN)

for(i in 1:198){
  temp <- df[i,]
  temp_long <- gather(temp, "Year", "Salinity", 2:54)

  temp_long$Year <- as.numeric(temp_long$Year)

  temp.lm <- lm(log(Salinity)~Year, data=temp_long, na.action = na.omit)

  result.tab[i,2] <- temp.lm$coefficients[2]
  result.tab[i,3] <- summary(temp.lm)$r.squared
  result.tab[i,4] <- anova(temp.lm)$'Pr(>F)'[1]

}