我使用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列出的相应方法,但你能计算出来自广播表的变化率吗? 谢谢。
答案 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]
}