【问题标题】:R apply function returning multiple values to each row of data frame and add these as new columns to the data frameR应用函数将多个值返回到数据框的每一行并将这些作为新列添加到数据框
【发布时间】:2016-04-13 09:41:24
【问题描述】:

假设我有一个数据框,它是 1 到 20 的序列与自身的叉积:

a <- seq(1,20,1)
combis <- expand.grid(a,a)
colnames(combis) <- c("DaysBack","DaysForward")

所以数据看起来像:

DaysBack  DaysForward
1         1
2         1
...
19        20
20        20

我想应用一个函数,该函数将天数往前,再往前数天,并返回几个值,然后将这些作为列添加到此数据框中。所以我的函数看起来像:

## operation to apply on each row
do_something <- function(days_back, days_forward)
{
    # logic to work out some values
    ...
    # return those values
    c(value_1, value_2, value_3)
}

然后将其添加到原始数据框中,因此“combis”应如下所示:

DaysBack  DaysForward  Value1  Value2  Value3
1         1            5       6       7
2         1            4       2       3
...
19        20           1       9       3
20        20           2       6       8

如何执行此操作并取回数据框。

编辑:

我的 do_something 函数目前在两个值上运行,days_backdays_forward。它在另一个名为 pod 的数据帧的上下文中使用这些,它(在本例中)看起来像:

Date          Price
2016-01-01    3.1
2016-01-02    3.33
...
2016-04-12    2.12

现在假设我传入 days_back=1days_forward=2,我所做的是为每一行找到 1 天前的价格和 2 天后的价格向前,然后我将其作为名为 Diff 的列添加到数据中。我通过添加适当的超前/滞后列来做到这一点(我发现 shift 代码在这里What's the opposite function to lag for an R vector/dataframe?),所以我没有做任何循环。一旦我得到每行的差异,我计算 Diff 的平均值和标准偏差并返回这两个值。 IE。对于 days_back=1days_forward=2 的组合,我有一些平均值和差异的标准差。现在我想要 days_backdays_forward 的所有组合,每个组合的范围从 1 到 20。在我第一次提出问题时给出的示例数据中,mean_diff 将对应于 Value1,而 sd_diff 将对应于 Value2,例如

所以要清楚,目前我的 do_something 直接对两个值而不是两组列向量进行操作。我确信它可以被重写以对两个向量进行操作,但是我又遇到了同样的问题,因为我不知道如何返回这些数据,所以最后我得到一个看起来像什么的数据框我在上面显示为我的目标输出。

谢谢

【问题讨论】:

    标签: r dataframe data.table plyr


    【解决方案1】:

    类似的东西

    # data
    d <- matrix(1,3,2)
    # function
    foo <- function(x,y) {
      m <- cbind(a=x+1,b=y+2) # calculations
      m # return
    } 
    # execute the function
    res <- foo(d[,1],d[,2])    
    # add results to data.frame/matrix
    cbind(d,res)
    

    编辑:正如您在 cmets 中询问的那样,我使用您的数据:

    a <- seq(1,20,1)
    combis <- expand.grid(a,a)
    colnames(combis) <- c("DaysBack","DaysForward")
    # function
    do_something <- function(x,y) cbind(a=x+1,b=y+2) 
    # results
    m <- cbind(combis,do_something(combis$DaysBack,combis$DaysForward))
    head(m)
    DaysBack DaysForward a b
    1        1           2 3
    2        1           3 3
    3        1           4 3
    4        1           5 3
    5        1           6 3
    6        1           7 3
    

    【讨论】:

    • 您可以跳过 m &lt;- ...return 位,只需将 cbind(a=x+1,b=y+2) 作为 foo() 的主体。
    • 参考我的例子,这条线会是 m &lt;- cbind(do_something(x,y)) 吗? .. 请记住,在我的 do_something 函数中 days_back 和 days_forward 是单独的值而不是向量 ..(而在您的 foo x 和 y 中是列向量)
    • @thelatemail 完全正确,我只是想表明可以在函数中保存和返回值。
    • @user555265 为什么days_backdays_forward 不应该是向量?它们是,你可以用它们计算。查看我的编辑。
    • @Jimbou 我在do_something 中使用days_backdays_forward 的方式是我有另一个数据框,我们将其称为pod。对于pod 中的每一行,我向后看days_back 行,并向前看days_forward 行,并计算我们称之为diff 的差异。我认为取这个diff 的平均值和标准差并返回那些..如果我传入一个向量,那么我需要对向量进行一些循环来执行此操作,然后它有效地回到我原来的问题,因为我不知道如何让这个循环操作返回数据适当的形式..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2014-08-02
    • 2022-12-21
    相关资源
    最近更新 更多