【问题标题】:Using a data_frame as an argument into a mutate and group_by routine使用 data_frame 作为 mutate 和 group_by 例程的参数
【发布时间】:2017-02-20 14:17:30
【问题描述】:

我这里有这个 data_frame (db) 有很多列:

A  B   C   D ...      ZZ
1  .23 .21   ...      .23
2  .45 .12   ...      .23
1  .47  ...          .53
2  .49  ...          .27

我想使用 group_by 并使用一个函数进行变异,该函数获取完整的 data_frame 并返回一个向量。

function1 <- function(data_frame) {
    ...
    return(vector)
}
db %>%
    group_by(A) %>%
    mutate(results = function1(.))

这不起作用。它返回对整个 data_frame 使用该函数的结果,而不是与组一起使用的结果。

我知道我可以使用 for 来解决它,但我正在寻找 dplyr 解决方案。该函数必须获得一个 data_frame,我没有将列单独作为参数传递。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    dplyr

    我的诀窍是使用bind_cols。它本身不会尊重任何组,因此您需要将其嵌套在 do 块中,例如:

    library(dplyr)
    mtcars %>%
        group_by(cyl) %>%
        do(bind_cols(., {
            # "insert complex stuff here"
            data_frame(results = apply(., 1, mean))
        }))
    # Source: local data frame [32 x 12]
    # Groups: cyl [3]
    #      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb  results
    #    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
    # 1   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1 23.59818
    # 2   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2 24.63455
    # 3   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2 27.23364
    # # ... with 29 more rows
    

    这种方法的好处是块中的代码可以返回一个或多个列,而无需进一步复杂化。

    因此,使用您的代码,它看起来像:

    db %>%
        group_by(A) %>%
        do(bind_cols(., data_frame(results = function(.))))
    

    tidyr

    另一种选择是使用tidy(RStudio 博客here,虽然有点过时但仍然有用)。

    library(tidyr) # nest, unnest
    library(purrr) # map
    mtcars %>%
        group_by(cyl) %>%
        nest() %>%
        mutate(results = map(data, ~ apply(., 1, mean))) %>%
        unnest()
    

    您的代码可能类似于(未经测试):

    db %>%
        group_by(A) %>%
        nest() %>%
        mutate(results = purrr::map(data, ~ function1(.))) %>%
        unnest()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2016-08-01
      相关资源
      最近更新 更多