[英]R: using ddply in a loop over data frame columns
我需要根据数据框中列的子集中的每一列中的值来计算并向数据框中添加多个新列。 这些列均保存时间序列数据(有一个公共日期列)。 例如,我需要为上一列计算上一年同月的更改。 我可以指定它们并单独计算它们,但是要转换大量列会变得很麻烦,因此我尝试使用for循环来自动化该过程。
我一直做得还可以,直到尝试使用ddply
为到目前为止的年度总值创建一列。 发生的情况是ddply
在循环的每次迭代期间添加了新行,并将这些新行包括在cumsum
计算中。 我有两个问题。
问:如何获得ddply以计算正确的总和? 问:如何在ddply调用期间指定列名,而不是使用虚拟值并在以后重命名?
[编辑:我讲得太早了,下面的更新代码目前无法正常运行,仅供参考]
require(lubridate)
require(plyr)
require(xts)
set.seed(12345)
# create dummy time series data
monthsback <- 24
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback),
myvalue1 = runif(monthsback, min = 600, max = 800),
myvalue2 = runif(monthsback, min = 200, max = 300))
mydf$year <- as.numeric(format(as.Date(mydf$mydate), format="%Y"))
mydf$month <- as.numeric(format(as.Date(mydf$mydate), format="%m"))
newcolnames <- c('myvalue1','myvalue2')
for (i in seq_along(newcolnames)) {
print(newcolnames[i])
mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)
## Calculate change over same month in previous year
mylag <- 12
mydf[, paste(newcolnames[i], "_yoy", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))
## Calculate change over previous month
mylag <- 1
mydf[, paste(newcolnames[i], "_mom", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))
## Calculate cumulative figure
#mydf$newcol <- as.numeric(mydf$myxts)
mydf$newcol <- 1
mydf <- ddply(mydf, .(year), transform, newcol = cumsum(as.numeric(mydf$myxts)))
colnames(mydf)[colnames(mydf)=="newcol"] <- paste(newcolnames[i], "_cuml", sep = "", collapse = "")
}
mydf
在您的循环中,由于myxts
不是数据帧的一部分,因此它不会在ddply
语句中与其他所有内容一起拆分。 更改为:
mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)
我不知道将任何动态生成的名称与transform
一起使用的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.