首页 文章

将dplyr do()按组输出到data.frame中

提问于
浏览
5

我使用dplyr使用do()函数将不同长度的曲线插入到相同的长度曲线中 .

然而,最后一步,正确格式化结果使我无法理解 . 目前,我获得了一个带有以下设置的data.frame:每组一行,每个变量都有一个包含结果的列表 .

library(dplyr)
    library(tidyr)

    df = data.frame(id = c(rep('a', 6), rep('b', 8)),
                    time = c(1:6, 1:8),
                    val = c(0.1, 0.2 ,0.4,0.6,0.75,1,
                            0.1, 0.25, 0.45, 0.6, 0.8, 0.9, 0.95, 1),
                    stringsAsFactors = FALSE) %>%
      group_by(id) %>% 
      mutate(total = n(),
             perc = time / total) %>%
      do(elapsed_perc= 1:5 / 5,
         duration_prog=approx(x=.$perc, y=.$val, xout = 1:5 / 5,)$y)

相反,我希望每组获得与观察一样多的行数 . 因此,在下面的情况中,我希望组'a'的5行作为组'b' .

一个解决方案是重新创建data.frame(我当然很容易动态):

df.new = data.frame(id = rep(c('a', 'b'), each = 5),
           elapsed_perc = unlist(df$elapsed_perc),
           duration_prog = unlist(df$duration_prog))

但是,我想这样做而不必创建新的数据框 . 你们中的任何人都知道怎么做吗?

1 回答

  • 3

    我们可以用 unnest

    library(tidyr)
    unnest(df, elapsed_perc, duration_prog)
    #      id elapsed_perc duration_prog
    #     <chr>        <dbl>         <dbl>
    #1      a          0.2          0.12
    #2      a          0.4          0.28
    #3      a          0.6          0.52
    #4      a          0.8          0.72
    #5      a          1.0          1.00
    #6      b          0.2          0.19
    #7      b          0.4          0.48
    #8      b          0.6          0.76
    #9      b          0.8          0.92
    #10     b          1.0          1.00
    

相关问题