當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。