【问题标题】:unused arguments error using apply() in R在 R 中使用 apply() 时出现未使用的参数错误
【发布时间】:2013-08-15 17:49:03
【问题描述】:

当我尝试对日期列使用 apply() 条件来返回一组系数时,我收到一条错误消息。

我有一个数据集(此处为简单起见进行了修改,但可重现):

ADataset <- data.table(Epoch = c("2007-11-15", "2007-11-16", "2007-11-17", 
                       "2007-11-18", "2007-11-19", "2007-11-20", "2007-11-21"),
                       Distance = c("92336.22", "92336.23", "92336.22", "92336.20",
                       "92336.19", "92336.21", "92336.18))
ADataset
        Epoch Distance
1: 2007-11-15 92336.22
2: 2007-11-16 92336.23
3: 2007-11-17 92336.22
4: 2007-11-18 92336.20
5: 2007-11-19 92336.19
6: 2007-11-20 92336.21
7: 2007-11-21 92336.18

分析从确定开始和结束日期开始:

############## Establish dates for analysis
#4.Set date for center of duration
StartDate <- "2007-11-18"
as.numeric(as.Date(StartDate)); StartDate
EndDate <- as.Date(tail(Adataset$Epoch,1)); EndDate

然后我确定分析的持续时间:

#5.Quantify duration of time window
STDuration <-  1
LTDuration  <- 3

然后我编写函数在两个持续时间上回归并返回斜率:

# Write STS and LTS functions, each with following steps
#6.Define time window- from StartDate less ShortTermDuration to 
StartDate plus ShortTermDuration
#7.Define Short Term & Long Term datasets
#8. Run regression over dataset
my_STS_Function <- function (StartDate) {

  STAhead  <- as.Date(StartDate) + STDuration; STAhead
  STBehind <- as.Date(StartDate) - STDuration; STBehind
  STDataset  <- subset(Adataset, as.Date(Epoch) >= STBehind & as.Date(Epoch)<STAhead)
  STResults <- rlm( Distance ~ Epoch, data=STDataset); STResults
  STSummary <- summary( STResults ); STSummary
  # Return coefficient (Slope of regression)
  STNum <- STResults$coefficients[2];STNum
}
my_LTS_Function <- function (StartDate) {
  LTAhead  <- as.Date(StartDate) + LTDuration; LTAhead
  LTBehind <- as.Date(StartDate) - LTDuration; LTBehind
  LTDataset  <- subset(Adataset, as.Date(Epoch) >= LTBehind & as.Date(Epoch)<LTAhead)
  LTResults <- rlm( Distance ~ Epoch, data=LTDataset); LTResults
  LTSummary <- summary( LTResults ); LTSummary
  # Return coefficient (Slope of regression)
  LTNum <- LTResults$coefficients[2];LTNum

然后我测试该函数以确保它适用于单个日期:

myTestResult <- my_STS_Function("2007-11-18")

它有效,所以我继续在数据集中的日期范围内应用该函数:

mySTSResult <- apply(Adataset, 1, my_STS_Function, seq(StartDate : EndDate))

...其中我想要的结果是 mySTSResult(斜率)的列表或数组或向量(以及随后的 myLTSResults 的单独列表/数组/向量,因此我可以在持续时间内创建 STSlope:LTSlope 比率),类似(mySTSResults 捏造)...

> Adataset
    Epoch Distance mySTSResults
1: 2007-11-15 92336.22            3
2: 2007-11-16 92336.23            4
3: 2007-11-17 92336.22            5
4: 2007-11-18 92336.20            6
5: 2007-11-19 92336.19            7
6: 2007-11-20 92336.21            8
7: 2007-11-21 92336.18            9

只有我得到这个错误:

Error in FUN(newX[, i], ...) : unused argument(s) (1:1185)

这告诉我什么以及如何纠正它?我做了一些查找,找不到更正。

希望我已经充分解释了这一点。如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 您的代码有许多小错误,无法重现 - 请修复
  • my_STS_Function 只有一个参数,但您要给它两个参数:数组切片和StartDate:EndDate
  • 只是为了确保您理解@hadley 点:Adataset 的每一行都将匹配my_STS_Function 的第一个参数,然后尝试将seq(StartDate : EndDate) 匹配到第二个参数论点……除非没有。 (此外,它应该是seq(StartDate, EndDate) 或只是StartDate : EndDate。)
  • 感谢您的澄清。我明白了。

标签: r regression


【解决方案1】:

好的,问题似乎出在my_STS_Function 的附加参数中,正如您在apply 函数调用中所述(因为您只使用一个参数定义了它)。日期范围作为附加参数传递给该函数,并且 R 抱怨它未使用(看起来是 1185 个元素的向量)。您是否更愿意尝试提取受日期范围限制的行的子集first,然后希望应用my_STS_Function?我必须考虑一下确切的解决方案。

抱歉 - 我在那里的 cmets 进行了锻炼。一个可能的解决方案是:

subSet &lt;- Adataset[Adataset[,1] %in% seq(StartDate:EndDate),][order(na.exclude(match(Adataset[,1], seq(StartData,EndDate))),]

改编自这个问题的答案:

R select rows in matrix from another vector (match, %in)

【讨论】:

  • 您可以通过排除数据范围之外的所有内容来定义数据的子集,例如:
  • subSet &lt;- Adataset[Adataset[,1] %in% seq(StartDate:EndDate),][order(na.exclude(match(Adataset[,1], seq(StartData,EndDate))),]
  • 为了解决您的问题,“您是否想先提取受日期范围限制的行的子集,然后希望应用 my_STS_Function?”,是的,我希望通过首先是日期范围,然后应用 my_STS_Function 以获得结果列表/向量/数组。
  • 当我在上面输入您的代码时,我收到以下错误: StartDate:EndDate 中的错误:NA/NaN 参数此外:警告消息:在 seq(StartDate:EndDate) 中:强制引入的 NAs > [order(na.exclude(match(Rdataset[,1], seq(StartDate,EndDate))),] 错误:“[”中的意外'['。我以为我在开头的代码中避免了NaN: as.numeric(as.Date(StartDate)); StartDate EndDate
  • ...而且添加(或减去)括号对错误没有任何影响,所以我不明白错误消息。
【解决方案2】:

将其添加为新答案,因为前一个答案令人困惑。之前的评论者是正确的,您的代码中存在错误,但它们不是症结所在。

我更新的方法是使用 seq.Date 生成日期序列(仅当您在开始和结束之间的每一天都有一个数据点时才有效 - 尽管您可以使用 na.exclude 如上所述):

dates = seq.Date(as.Date(StartDate),as.Date(EndDate),"days")

然后,您将其用作应用的输入,并使用一些类型来使事情正常工作(我已经使用 lamda 函数完成了此操作):

mySTSResult <- apply(as.matrix(dates), 1, function(x) {class(x) <- "Date"; my_STS_Function(x)})

然后希望您应该有一个结果向量,并且您应该能够对 LTS 执行类似的操作,然后将其处理到原始数据框/矩阵中的另一列中。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多