我正在尝试编写一个函数,该函数将包含时间序列数据的数据框的名称和该数据框中列的名称作为参数.该函数对该数据执行各种操作,其中一个操作是在列中添加每年的运行总计.我正在使用普利尔.
当我直接使用ddply和cumsum的列名时我没有问题:
require(plyr)
df <- data.frame(date = seq(as.Date("2007/1/1"),
by = "month",
length.out = 60),
sales = runif(60, min = 700, max = 1200))
df$year <- as.numeric(format(as.Date(df$date), format="%Y"))
df <- ddply(df, .(year), transform,
cum_sales = (cumsum(as.numeric(sales))))
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但最终目标是能够将列名称传递给此函数.当我尝试使用变量代替列名时,它不能像我预期的那样工作:
mycol <- "sales"
df[mycol]
df <- ddply(df, .(year), transform,
cum_value2 = cumsum(as.numeric(df[mycol])))
Run Code Online (Sandbox Code Playgroud)
我以为我知道如何按名称访问列.这让我很担心,因为它表明我无法理解索引和提取的基本内容.我原本以为以这种方式按名称引用列将是一个常见的需求.
我有两个问题.
TIA
ddply的参数是在原始数据帧被拆分的每个部分的上下文中计算的表达式.你的df [myval]解决了整个数据框,所以你不能按原样传递它(顺便说一句,为什么你需要那些as.numeric(as.character())东西 - 它们完全没用).
最简单的方法是编写自己的函数,它将完成所有内容并传递列名,例如
df <- ddply(df,
.(year),
.fun = function(x, colname) transform(x, cum_sales = cumsum(x[,colname])),
colname = "sales")
Run Code Online (Sandbox Code Playgroud)