【问题标题】:Apply function to all rows in the loop and put the results in new column将函数应用于循环中的所有行并将结果放入新列
【发布时间】:2015-04-15 13:25:50
【问题描述】:

我认为标题主要解释了我想要做的事情。由于我对循环不是很有经验,我需要你的帮助。

我拥有的数据:

> dput(data)
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778936.666666667, 
0, 0, 0, 0, 2478666.66666667, 2255834.16666667, 0, 1797065.41666667, 
0, 0, 8091450, 10536461.5079365, 0, 2325600, 0, 0, 0, 1011700, 
2049325, 870025, 0, 0, 0, 892385, 3216538.33333333, 960480, 1024325, 
0, 0, 557780, 5798938.88888889, 846266.666666667, 1183267.5, 
0, 0, 1126786.66666667, 7603630.47619048, 888885, 1771708.33333333, 
0, 0, 1557738.33333333, 5441300, 0, 2007712.33333333, 0, 0, 1792833.33333333, 
3435203.33333333, 1913650, 3339118.93939394, 0, 0, 1047475, 2194228.33333333, 
1248360, 973797.916666667, 671265, 0, 804250, 0, 0, 0, 0, 0, 
0, 1788100, 1746900, 2140050, 2584000, 0, 947850, 0, 462237.5, 
639437.666666667, 636732.333333333, 0, 0, 0, 508568.333333333, 
1397257.5, 1016524.58333333, 0, 0, 0, 270466.666666667, 742731.785714286, 
408040.681818182, 0, 0, 0, 316706.666666667, 714654.722222222, 
592564.294871795, 0, 0, 0, 255310, 434271.5, 590129.537037037, 
0, 0, 0, 617560, 227435, 367492.5, 0, 0), .Dim = c(6L, 20L), .Dimnames = list(
    c("Greg", "Tommy", "Seb", "Martin", "Alesa", "Yuri"), c("January", 
    "February", "March", "April", "May", "June", "July", "August", 
    "September", "October", "January2", "February2", "March2", 
    "April2", "May2", "June2", "July2", "August2", "September2", 
    "October2")))

函数所需的向量:

> dput(vec_list)
c(10L, 34L, 59L, 84L, 110L, 134L, 165L, 199L, 234L, 257L, 362L, 
433L, 506L, 581L, 652L, 733L, 818L, 896L, 972L, 1039L)

现在我想应用于整个数据的函数(比给定的例子大得多):

work_func <- function(i) data[1,] <- AIC(lm(vec_list~poly(data[1,],i, raw=TRUE)))
as.integer(optimize(work_func,interval = c(1,length(data[1,])-1))$minimum)

这只是单行。每行的结果应该只是一个简单的数字,我想将其放入新列或将其存储为向量...

【问题讨论】:

  • 你在标题中得到答案:试试apply(data, 1, function(u) ...your function there returning a scalar....)
  • 您能否更详细地解释一下您的目标是什么?您想找到每个数据行的最小 AIC 吗?这有什么用?

标签: r


【解决方案1】:

正如@Colonel 正确指出的那样,您可以在此处使用apply,边距为1

My_func <- function(x) {
                work_func <- function(i) AIC(lm(vec_list ~ poly(x, i, raw = TRUE)))
                as.integer(optimize(work_func, interval = c(1, length(x) - 1))$minimum)
}

apply(data, 1, My_func)
# Greg  Tommy    Seb Martin  Alesa   Yuri 
#    2     12     12      6     18     18 

【讨论】:

    【解决方案2】:

    请注意,work_func 仅对i 的整数值才真正有意义,并且是不连续的,因此optimize 可能不是正确的策略,相反我已经搜索了所有整数值。使用您的数据,

    optim_fun <- function(x){
      work_fun <- function(i) AIC(lm(vec_list~poly(x,i, raw=TRUE)))
      which.min(sapply(1:(length(x)-1),work_fun))
    }
    
    AIC <- apply(data,1,optim_fun) 
    

    产生输出

    > AIC
    # Greg  Tommy    Seb Martin  Alesa   Yuri 
    # 1     12     15      6      1      2 
    

    这是使每一行的 AIC 最小化的多项式阶数。

    为了稍微解释一下,我刚刚更改了 work_fun 以使用 optim_fun 中设置的数据 x 返回 AIC 以获取功率 ioptim_funi 的整数值处评估 work_fun 并找到最小化此的 i。最后一行依次将其应用于数据的每一行。

    编辑

    与 David Arenburg 几乎同时发布,所以我将快速评论为什么我们会得到不同的结果 - 这取决于使用 optimize。我的回答发现 Greg 的值略低:

    > work_fun(1)
    [1] 294.0098
    > work_fun(2)
    [1] 294.1508
    

    请注意,对于 Seb:

    > work_fun(12)
    [1] 268.0117
    > work_fun(13)
    [1] 268.0117
    > work_fun(14)
    [1] 268.0117
    > work_fun(15)
    [1] 268.0117
    

    同样,我认为我的答案更适合 Yuri,但所有 i 都为 Alesa 提供了相同的 AIC,因此答案未定义。

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 2015-07-31
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多