当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dplyr reframe 将每个组转换为任意数量的行


[Experimental]

summarise() 要求每个参数返回单个值,而 mutate() 要求每个参数返回与输入相同的行数,而 reframe() 是更通用的工具,对每个组返回的行数没有要求。

reframe() 通过将函数应用于现有 DataFrame 的列来创建新的 DataFrame 。它与 summarise() 最相似,但有两个很大的区别:

  • reframe() 可以为每组返回任意数量的行,而 summarise() 将每个组减少为单行。

  • reframe() 始终返回未分组的数据帧,而 summarise() 可能返回分组或按行数据帧,具体取决于具体情况。

我们预计您使用 summarise() 的频率要比使用 reframe() 的频率高得多,但是当您需要应用不返回单个汇总值的复杂函数时,reframe() 会特别有用。

用法

reframe(.data, ..., .by = NULL)

参数

.data

数据帧、数据帧扩展(例如 tibble)或惰性数据帧(例如来自 dbplyr 或 dtplyr)。有关更多详细信息,请参阅下面的方法。

...

<data-masking>

Name-value 函数对。该名称将是结果中变量的名称。该值可以是任意长度的向量。

未命名的 DataFrame 值从单个表达式添加多个列。

.by

[Experimental]

< tidy-select > (可选)仅针对此操作选择要分组的列,作为 group_by() 的替代方案。有关详细信息和示例,请参阅?dplyr_by

如果 .data 是一个 tibble,那么就是一个 tibble。否则,一个 DataFrame 。

  • 这些行源自底层分组键。

  • 这些列是分组键和您提供的表达式的组合。

  • 输出始终未分组。

  • DataFrame 属性不会保留,因为 reframe() 从根本上创建了一个新的 DataFrame 。

连接到 tible

reframe() 理论上连接到 tibble 中的两个函数 tibble::enframe()tibble::deframe()

  • enframe():矢量 -> DataFrame

  • deframe(): DataFrame ->向量

  • reframe(): DataFrame -> DataFrame

方法

该函数是泛型函数,这意味着包可以为其他类提供实现(方法)。有关额外参数和行为差异,请参阅各个方法的文档。

当前在加载的包中可以使用以下方法: dplyr ( data.frame ) 。

也可以看看

其他单表动词: arrange()filter()mutate()rename()select()slice()summarise()

例子

table <- c("a", "b", "d", "f")

df <- tibble(
  g = c(1, 1, 1, 2, 2, 2, 2),
  x = c("e", "a", "b", "c", "f", "d", "a")
)

# `reframe()` allows you to apply functions that return
# an arbitrary number of rows
df %>%
  reframe(x = intersect(x, table))
#> # A tibble: 4 × 1
#>   x    
#>   <chr>
#> 1 a    
#> 2 b    
#> 3 f    
#> 4 d    

# Functions are applied per group, and each group can return a
# different number of rows.
df %>%
  reframe(x = intersect(x, table), .by = g)
#> # A tibble: 5 × 2
#>       g x    
#>   <dbl> <chr>
#> 1     1 a    
#> 2     1 b    
#> 3     2 f    
#> 4     2 d    
#> 5     2 a    

# The output is always ungrouped, even when using `group_by()`
df %>%
  group_by(g) %>%
  reframe(x = intersect(x, table))
#> # A tibble: 5 × 2
#>       g x    
#>   <dbl> <chr>
#> 1     1 a    
#> 2     1 b    
#> 3     2 f    
#> 4     2 d    
#> 5     2 a    

# You can add multiple columns at once using a single expression by returning
# a data frame.
quantile_df <- function(x, probs = c(0.25, 0.5, 0.75)) {
  tibble(
    val = quantile(x, probs, na.rm = TRUE),
    quant = probs
  )
}

x <- c(10, 15, 18, 12)
quantile_df(x)
#> # A tibble: 3 × 2
#>     val quant
#>   <dbl> <dbl>
#> 1  11.5  0.25
#> 2  13.5  0.5 
#> 3  15.8  0.75

starwars %>%
  reframe(quantile_df(height))
#> # A tibble: 3 × 2
#>     val quant
#>   <dbl> <dbl>
#> 1   167  0.25
#> 2   180  0.5 
#> 3   191  0.75

starwars %>%
  reframe(quantile_df(height), .by = homeworld)
#> # A tibble: 147 × 3
#>    homeworld   val quant
#>    <chr>     <dbl> <dbl>
#>  1 Tatooine   166.  0.25
#>  2 Tatooine   175   0.5 
#>  3 Tatooine   183   0.75
#>  4 Naboo      165   0.25
#>  5 Naboo      183   0.5 
#>  6 Naboo      190.  0.75
#>  7 Alderaan   169   0.25
#>  8 Alderaan   188   0.5 
#>  9 Alderaan   190.  0.75
#> 10 Stewjon    182   0.25
#> # ℹ 137 more rows

starwars %>%
  reframe(
    across(c(height, mass), quantile_df, .unpack = TRUE),
    .by = homeworld
  )
#> # A tibble: 147 × 5
#>    homeworld height_val height_quant mass_val mass_quant
#>    <chr>          <dbl>        <dbl>    <dbl>      <dbl>
#>  1 Tatooine        166.         0.25     75         0.25
#>  2 Tatooine        175          0.5      80.5       0.5 
#>  3 Tatooine        183          0.75     93         0.75
#>  4 Naboo           165          0.25     50.2       0.25
#>  5 Naboo           183          0.5      70.5       0.5 
#>  6 Naboo           190.         0.75     80.2       0.75
#>  7 Alderaan        169          0.25     56.5       0.25
#>  8 Alderaan        188          0.5      64         0.5 
#>  9 Alderaan        190.         0.75     71.5       0.75
#> 10 Stewjon         182          0.25     77         0.25
#> # ℹ 137 more rows
源代码:R/reframe.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Transform each group to an arbitrary number of rows。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。