【问题标题】:How to pass arguments to a function inside *apply family functions如何将参数传递给 *apply 系列函数中的函数
【发布时间】:2016-10-19 06:24:09
【问题描述】:

我有以下数据集:

dput(tt2)
structure(c(1371.25, NA, 1373.95, NA, NA, 1373, NA, 1373.95, 
1373.9, NA, NA, 1374, 1374.15, NA, 1374, 1373.85, 1372.55, 1374.05, 
1374.15, 1374.75, NA, NA, 1375.9, 1374.05, NA, NA, NA, NA, NA, 
NA, NA, 1375, NA, NA, NA, NA, NA, 1376.35, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 1376.25, NA, 1378, 1376.5, NA, NA, NA, 1378, 
1378, NA, NA, 1378.8, 231.9, 231.85, NA, 231.9, 231.85, 231.9, 
231.8, 231.9, 232.6, 231.95, 232.35, 232, 232.1, 232.05, 232.05, 
232.05, 231.5, 231.3, NA, NA, 231.1, 231.1, 231.1, 231, 231, 
230.95, 230.6, 230.6, 230.7, 230.6, 231, NA, 231, 231, 231.45, 
231.65, 231.4, 231.7, 231.3, 231.25, 231.25, 231.4, 231.4, 231.85, 
231.75, 231.5, 231.55, 231.35, NA, 231.5, 231.5, NA, 231.5, 231.25, 
231.15, 231, 231, 231, 231.05, NA), .Dim = c(60L, 2L), .indexCLASS = c("POSIXct", 
"POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "Asia/Calcutta", tzone = "Asia/Calcutta", index = structure(c(1459482300, 
1459483766.38983, 1459485231.77966, 1459486697.16949, 1459488162.55932, 
1459489627.94915, 1459491093.33898, 1459492558.72881, 1459494025.11864, 
1459495490.50847, 1459496955.89831, 1459498421.28814, 1459499887.67797, 
1459501353.0678, 1459502818.45763, 1459504283.84746, 1459505749.23729, 
1459507214.62712, 1459508680.01695, 1459510145.40678, 1459511610.79661, 
1459513076.18644, 1459514541.57627, 1459516007.9661, 1459517474.35593, 
1459518939.74576, 1459520405.13559, 1459521870.52542, 1459523335.91525, 
1459524804.30508, 1459526269.69492, 1459527735.08475, 1459529200.47458, 
1459530667.86441, 1459532134.25424, 1459533600.64407, 1459535066.0339, 
1459536531.42373, 1459537996.81356, 1459539702.20339, 1459541167.59322, 
1459542634.98305, 1459544100.37288, 1459545565.76271, 1459547031.15254, 
1459548496.54237, 1459549961.9322, 1459551429.32203, 1459552894.71186, 
1459554360.10169, 1459555829.49153, 1459557294.88136, 1459558760.27119, 
1459560225.66102, 1459561691.05085, 1459563160.44068, 1459564625.83051, 
1459566091.22034, 1459567557.61017, 1459569028), tclass = c("POSIXct", 
"POSIXt"), tzone = "Asia/Calcutta"), .Dimnames = list(NULL, c("A", 
"B")), class = c("xts", "zoo"))

我想学习如何将参数传递给 apply 系列函数中的函数。 第一个例子: 由于数据中有 NA,所以 mean 函数返回 NA。所以想通过na.rm=TRUE

tt<-apply.daily(tt2, function(x) sapply(x,mean(na.rm=TRUE)))

但它会返回:

Error in mean.default(na.rm = TRUE) : 
  argument "x" is missing, with no default

第二个例子: 我想使用 period.sum 函数,它只接受单列值并且需要列的索引。

tt<-lapply(tt2, period.sum, endpoints(tt2))

Error in FUN(X[[i]], ...) : NA/NaN/Inf in foreign function call (arg 3)

我知道第二个例子可以用period.apply 解决,但由于 lapply 是一个通用类型函数,第二个例子也可以用 lapply 解决吗?

【问题讨论】:

  • sapply(x, mean, na.rm=TRUE) 我猜。或者甚至可能只是:apply.daily(tt2, mean, na.rm=TRUE)
  • 您可以尝试 curry 您现有的函数来创建您应用的新函数。 stackoverflow.com/questions/2228544/…
  • @cricket_007 不错的参考,但遗憾的是我仍然停留在初学者水平。
  • @Procrastinatus Maximus 我已经完成了提到的问题。我的第二个例子表明我完全应用了它。但我仍然收到错误,因此我的问题不是重复的。

标签: r function apply lapply


【解决方案1】:

您可以通过省略号 (...) 参数在 apply 系列的所有函数中传递参数,参见。 help page on sapply。现在,apply.daily 只是对xts 对象的扩展,请参阅?apply.daily

 apply.daily(tt2, mean, na.rm=TRUE)
#apply.daily(  x,  FUN,        ...)

【讨论】:

  • 看我的第二个例子
  • @runjumpfly 答案也适用于您的第二个示例。
  • @HongOoi FUN(X[[i]], ...) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 3)
  • @runjumpfly you should not ask more than one question per post。但你可以做period.apply(tt2,endpoints(tt2),colSums,na.rm=TRUE)
  • 我想用第二个例子问的是如何在 lapply 的 period.sum 中将参数传递给端点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多