【发布时间】:2014-02-26 18:53:18
【问题描述】:
又一个apply 问题。
我查看了很多关于 R 中 apply 函数系列的文档(并在我的工作中使用了很多)。我已经定义了一个函数myfun,我想在它下面应用到数据帧inc 的每一行。我想我需要一些apply(inc,1,myfun) 的变体,我已经玩了一段时间了,但还是不太明白。我已经包含了一个循环,它完全实现了我想要做的......它对我的真实数据来说超级慢而且效率低下,这比我在这里包含的样本数据要大得多。
我希望这是一个快速修复,但我不能完全确定它...也许有特殊参数 ... 可以应用?
以下代码的英文版:我想查看inc 数据框中的所有提交日期,并为每个日期查找chg 中有多少行chg$Submit.Date 在其中inc$Submit.Date 的一些范围。其中范围由myfun中的fdays和bdays控制
设置一些虚假数据
chgdf <- data.frame(Submit.Date=as.Date(c("2013-09-27", "2013-09-4", "2013-08-01", "2013-06-24", '2013-05-29', '2013-08-20')), ID=c('001', '001', '001', '001', '001', '005'), stringsAsFactors=F)
incdf <- data.frame(Submit.Date=as.Date(c("2013-10-19", "2013-09-14", "2013-08-22", '2013-08-20')), ID=c('001', '001', '002', '006'), stringsAsFactors=F)
我想应用于数据框每一行的函数
myfun <- function(tdate, aid, chg=chgdf, inc=incdf, fdays=30, bdays=30) {
fdays <- tdate+fdays
bdays <- tdate-bdays
chg2 <- chg[chg$ID==aid & chg$Submit.Date<fdays & chg$Submit.Date>bdays, ]
ret <- nrow(chg2)
return(ret)
}
适用于一行 inc 数据帧
tdate <- inc[inc$ID==aid, 'Submit.Date'][1]
myfun(tdate, aid='001', bdays=50, fdays=100)
工作但速度慢...使用完整的数据集
inc$chgw <- 0
for(i in 1:nrow(inc)){
aid <- inc$ID[i]
tdate <- inc$Submit.Date[i]
inc$chgw[i] <- myfun(tdate, aid, bdays=50, fdays=100)
}
【问题讨论】:
-
怀疑该示例是否有效,因为
tdate是一个字符串,您可以像使用myfun中的数字一样使用它 -
另见
mapply(或等效的Vectorize):Vectorize(myfun)(incdf$Submit.Date, incdf$ID, bdays = 50, fdays = 100)
标签: r date vectorization apply