【问题标题】:Using ftransform along with fgroup_by from collapse R package使用 ftransform 和来自 collapse R 包的 fgroup_by
【发布时间】:2021-07-24 17:35:02
【问题描述】:

我正在尝试使用Rcollapse 重现dplyr 代码的以下输出。

dplyr代码

library(tidyverse)
starwars %>%
  select(name, mass, species) %>%
  group_by(species) %>%
  mutate(mass_norm = mean(mass, na.rm = TRUE))

dplyr代码输出

# A tibble: 87 x 4
# Groups:   species [38]
   name                mass species mass_norm
   <chr>              <dbl> <chr>       <dbl>
 1 Luke Skywalker        77 Human        82.8
 2 C-3PO                 75 Droid        69.8
 3 R2-D2                 32 Droid        69.8
 4 Darth Vader          136 Human        82.8
 5 Leia Organa           49 Human        82.8
 6 Owen Lars            120 Human        82.8
 7 Beru Whitesun lars    75 Human        82.8
 8 R5-D4                 32 Droid        69.8
 9 Biggs Darklighter     84 Human        82.8
10 Obi-Wan Kenobi        77 Human        82.8
# … with 77 more rows

collapse代码

library(collapse)
starwars %>%
  fselect(name, mass, species) %>%
  fgroup_by(species) %>%
  ftransform(mass_norm = fmean(mass, na.rm = TRUE))

collapse代码输出

# A tibble: 87 x 4
   name                mass species mass_norm
 * <chr>              <dbl> <chr>       <dbl>
 1 Luke Skywalker        77 Human        97.3
 2 C-3PO                 75 Droid        97.3
 3 R2-D2                 32 Droid        97.3
 4 Darth Vader          136 Human        97.3
 5 Leia Organa           49 Human        97.3
 6 Owen Lars            120 Human        97.3
 7 Beru Whitesun lars    75 Human        97.3
 8 R5-D4                 32 Droid        97.3
 9 Biggs Darklighter     84 Human        97.3
10 Obi-Wan Kenobi        77 Human        97.3
# … with 77 more rows

Grouped by:  species  [38 | 2 (5.5)] 

想知道为什么我的 collapse 代码回答错误。任何提示。

【问题讨论】:

    标签: r dplyr tidyverse collapse


    【解决方案1】:

    fmean 默认使用na.rm = TRUE。此外,还有一个选项可以在fmean 中指定分组,即g。默认情况下,TRANULL,它返回一个汇总输出,但我们可以将其更改为 replace_fill 以返回完整长度

    library(collapse)
    ftransform(slt(starwars, name, mass, species),
          mass_norm = fmean(mass, species, TRA = 'replace_fill'))
    

    -输出

    # A tibble: 87 x 4
    #   name                mass species mass_norm
    # * <chr>              <dbl> <chr>       <dbl>
    # 1 Luke Skywalker        77 Human        82.8
    # 2 C-3PO                 75 Droid        69.8
    # 3 R2-D2                 32 Droid        69.8
    # 4 Darth Vader          136 Human        82.8
    # 5 Leia Organa           49 Human        82.8
    # 6 Owen Lars            120 Human        82.8
    # 7 Beru Whitesun lars    75 Human        82.8
    # 8 R5-D4                 32 Droid        69.8
    # 9 Biggs Darklighter     84 Human        82.8
    #10 Obi-Wan Kenobi        77 Human        82.8
    # … with 77 more rows
    

    如果我们要使用链,请使用GRP 指定g 或数据上的分组变量(.

    library(dplyr)
    starwars %>%
     fselect(name, mass, species) %>%
     fgroup_by(species) %>%
     ftransform(mass_norm = fmean(mass, GRP(.), TRA = 'replace'))
    

    【讨论】:

    • 感谢@akrun 提供有用的答案。如果能解释一下我的代码有什么问题,将不胜感激。
    • @MYaseen208 更新对您有帮助吗?函数有g或需要指定的分组
    • 感谢@akrun 的帮助。我明白了。
    猜你喜欢
    • 2021-10-26
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多