R 计算“长”数据帧中的百分比变化

R 计算“长”数据帧中的百分比变化,r,R,我有一个数据框架,其中包含按国家划分的GDP值,并附带一个日期列。以下代码复制了两个国家FR和DE以及2005-2010六年的样本数据集: df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), date = stru

我有一个数据框架,其中包含按国家划分的GDP值,并附带一个日期列。以下代码复制了两个国家FR和DE以及2005-2010六年的样本数据集:

df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
                2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), 
                 date = structure(c(12784, 13149, 13514, 13879, 14245, 14610, 
                 12784, 13149, 13514, 13879, 14245, 14610), class = "Date"), 
                 GDP = c(2147975, 2249584.4, 2373993.1, 2382892.6, 2224501.8, 
                2371033.2, 1557584.8, 1621633.2, 1715655.4, 1713157.1, 1636336.3, 
               1707966.5)), .Names = c("geo", "date", "GDP"), row.names = c(NA, 
              -12L), class = "data.frame")
现在,我想计算一个额外的列,显示每年的百分比差异。我尝试以下方法:

library(quantmod) 
# provides the Delt() function to calculate percent differences

df$dtGDP <- as.numeric(Delt(df$GDP))
这是错误的,因为它使用2010年的DE值来计算2005年的FR值。有没有办法按系数级别应用函数?

试试以下方法:

foo <- aggregate(GDP~geo, df, function(x) list(Delt(x)))
df <- cbind(df, dtGDP = as.numeric(unlist(foo[,-1])))
df
假设您已经运行了以下操作:

library(quantmod) 
df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
                2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), 
                date = structure(c(12784, 13149, 13514, 13879, 14245, 14610, 
                12784, 13149, 13514, 13879, 14245, 14610), class = "Date"), 
                GDP = c(2147975, 2249584.4, 2373993.1, 2382892.6, 2224501.8, 
                2371033.2, 1557584.8, 1621633.2, 1715655.4, 1713157.1, 1636336.3, 
                1707966.5)), .Names = c("geo", "date", "GDP"), row.names = c(NA, 
                -12L), class = "data.frame")
试试这个:

foo <- aggregate(GDP~geo, df, function(x) list(Delt(x)))
df <- cbind(df, dtGDP = as.numeric(unlist(foo[,-1])))
df
假设您已经运行了以下操作:

library(quantmod) 
df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
                2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), 
                date = structure(c(12784, 13149, 13514, 13879, 14245, 14610, 
                12784, 13149, 13514, 13879, 14245, 14610), class = "Date"), 
                GDP = c(2147975, 2249584.4, 2373993.1, 2382892.6, 2224501.8, 
                2371033.2, 1557584.8, 1621633.2, 1715655.4, 1713157.1, 1636336.3, 
                1707966.5)), .Names = c("geo", "date", "GDP"), row.names = c(NA, 
                -12L), class = "data.frame")

这是一个非常典型的拆分-应用-合并问题,你很可能会找到大量的答案。@BenBarnes我仍然喜欢下面的DWin答案!实际上@BenBarnes可能是正确的。如果你搜索tapply和“ave”,你可能会发现很多与我非常相似的例子。另一方面,你会发现许多使用plyr软件包函数的工作示例,它们本质上是彼此同构的,并且与此同构。这是一个非常典型的拆分-应用-组合问题,你可能会找到大量的答案。@BenBarnes我仍然喜欢下面的DWin答案!实际上@BenBarnes可能是正确的。如果你搜索tapply和“ave”,你可能会发现很多与我非常相似的例子。另一方面,你会发现许多使用plyr包函数的工作示例,这些函数本质上是彼此同构的,并且与这个函数同构。非常好!我表演了两行,你表演了一行,棒极了!我在两行中表演,你在一个命令中表演