【问题标题】:Looping on aggregate function循环聚合函数
【发布时间】:2014-09-19 13:54:13
【问题描述】:

我有一个数据框,df = (Var1,Day,Month,Years)。我需要对每年的数据进行显着性检验。但是需要传递给函数的参数(在这种情况下是显着性测试)在另一个数据框中。我使用以下代码,但没有得到正确的结果。 [其中 param1 和 param2 是带有每年参数的向量]

for (i in (no.of.years))    
{
  result_stat <- aggregate(Var1~YY,df,function(X)ks.test(X,'pgamma',shape = param1[i], rate = param2[i]))
} 

能否请您告诉我我的 for 循环有什么问题?当相同的步骤在没有循环的情况下单独执行时[即,手动获取每年的数据并通过硬编码参数 param1 和 param2] 我得到一组不同的结果。

【问题讨论】:

  • 首先,你需要使用[来访问向量元素,所以将param1(i)修改为param1[i]param2也一样)。同样result_stat 在每次迭代中都会被覆盖,您需要将其定义为一个列表,然后将每次迭代的结果分配给result_stat[[i]]。要获得更多帮助,请提供信息以便您的问题可以重现,并提供有关您遇到的错误的更多详细信息。
  • 第一个是错字。我没有收到任何错误,但我得到了不正确的测试统计信息。我认为问题是函数内的“i”,而函数内又是聚合。
  • 我认为i 不会有问题,它应该可以很好地传递给函数。问题的另一个猜测可能是您只想对包含特定年份的数据子集使用聚合,但您在所有年份都这样做? aggregate 中的 Var1YY 到底是什么,你有附加数据框吗?
  • Var1 为每日降雨量数据。 YY是年。我有 50 年的数据,并希望使用特定参数运行每年的拟合优度(ks.test)。我在另一个向量中拥有这些参数 50 年。
  • 我只需要for循环来增加param1和param2中'i'的值。但是聚合函数似乎在一次迭代中运行该函数(多年来)。

标签: r for-loop aggregate-functions


【解决方案1】:

我认为您的问题是您在整个数据上运行aggregate,而不是给定年份的子集。由于您没有提供有关数据的更多信息,因此我假设它看起来像这样

df 
#       Var1   YY Month Day
#   7.896072 2000     1   1
#  11.881620 2000     2   2
#  12.315676 2000     3   3
#   7.459200 2010     1  10
#  10.944619 2010     2  11
#  11.371278 2010     3  12

正如你所说,你的参数在另一个数据框中

params
#  YY   param1 param2
#  2000      1    0.1
#  2010      2    0.2

由于您多年来一直在运行for 循环,因此您不需要aggregate;每年只取df 的子集

years <- unique(df$YY)
result_stat <- vector("list", length(years))
names(result_stat) <- years
for (i in seq_along(years)) {
    y <- years[[i]]
    result_stat[[i]] <- ks.test(df[df$YY == y, ]$Var1, "pgamma", 
        shape = params[params$YY == y, ]$param1,
        rate = params[params$YY == y, ]$param2)
}

【讨论】:

  • 成功了!不知道我可以使用 df[df$YY == y, ]$Var1。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
相关资源
最近更新 更多