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


R dbplyr pivot_wider.tbl_lazy 將數據從長軸轉向寬軸


pivot_wider() "widens"數據,增加列數並減少行數。逆變換為 pivot_longer() 。在vignette("pivot", "tidyr") 中了解更多信息。

請注意,pivot_wider() 不是也不可能是懶惰的,因為我們需要查看數據來確定新的列名是什麽。

用法

# S3 method for tbl_lazy
pivot_wider(
  data,
  ...,
  id_cols = NULL,
  id_expand = FALSE,
  names_from = name,
  names_prefix = "",
  names_sep = "_",
  names_glue = NULL,
  names_sort = FALSE,
  names_vary = "fastest",
  names_expand = FALSE,
  names_repair = "check_unique",
  values_from = value,
  values_fill = NULL,
  values_fn = ~max(.x, na.rm = TRUE),
  unused_fn = NULL
)

參數

data

由數據庫查詢支持的惰性 DataFrame 。

...

沒用過;包含在內是為了與通用兼容。

id_cols

唯一標識每個觀察值的一組列。

id_expand

沒用過;包含在內是為了與通用兼容。

names_from, values_from

一對參數,說明從哪一列(或多列)獲取輸出列的名稱 ( names_from ),以及從哪一列(或多列)獲取單元格值 ( values_from )。

如果values_from包含多個值,該值將被添加到輸出列的前麵。

names_prefix

添加到每個變量名稱開頭的字符串。

names_sep

如果 names_fromvalues_from 包含多個變量,這將用於將它們的值連接到單個字符串中以用作列名稱。

names_glue

您可以提供使用 names_from 列(和特殊的 .value )來創建自定義列名稱的粘合規範,而不是 names_sepnames_prefix

names_sort

列名應該排序嗎?如果是FALSE(默認值),則列名稱按首次出現排序。

names_vary

names_from 標識具有多個唯一值的列(或多列),並且提供了多個 values_from 列時,應按什麽順序組合結果列名稱?

  • "fastest" 以最快的速度改變 names_from 值,從而產生以下形式的列命名方案: value1_name1, value1_name2, value2_name1, value2_name2 。這是默認設置。

  • "slowest" 以最慢的速度改變 names_from 值,從而產生以下形式的列命名方案: value1_name1, value2_name1, value1_name2, value2_name2

names_expand

在旋轉之前,names_from 列中的值是否應該擴展expand()?這會產生更多列,輸出將包含與 names_from 中所有可能值的完整擴展相對應的列名稱。此外,列名將被排序,與 names_sort 生成的內容相同。

names_repair

如果輸出具有無效的列名稱,會發生什麽情況?

values_fill

(可選)一個(標量)值,指定每個 value 在缺失時應填充的內容。

values_fn

一個函數,默認為 max() ,應用於輸出中每個單元格中的value。與本地數據幀相反,它不能是 NULL

unused_fn

(可選)應用一個函數來匯總未使用列(即未由 id_colsnames_fromvalues_from 標識的列)中的值。

默認情況下會從結果中刪除所有未使用的列。

如果您想將不同的聚合應用於不同的未使用列,這可以是命名列表。

必須提供 id_cols 才能使 unused_fn 有用,否則所有未指定的列都將被視為 id_cols

這類似於按 id_cols 進行分組,然後使用 unused_fn 匯總未使用的列。

細節

本地數據幀與 pivot_wider() 的最大區別在於 values_fn 不能是 NULL 。默認情況下,如果 id_colsvalue 列的組合唯一標識一個觀察值,則 max() 會產生與本地數據幀相同的結果。請注意,如果觀察結果未唯一標識,您也不會收到警告。

SQL 代碼的翻譯本質上如下:

  1. 獲取 names_from 列中的唯一鍵。

  2. 對於每個鍵值生成以下形式的表達式:

    value_fn(
      CASE WHEN (`names from column` == `key value`)
      THEN (`value column`)
      END
    ) AS `output column`
  3. 按 id 列對數據進行分組。

  4. 使用步驟 2 中的表達式匯總分組數據。

例子

memdb_frame(
  id = 1,
  key = c("x", "y"),
  value = 1:2
) %>%
  tidyr::pivot_wider(
    id_cols = id,
    names_from = key,
    values_from = value
  )
#> # Source:   SQL [1 x 3]
#> # Database: sqlite 3.41.2 [:memory:]
#>      id     x     y
#>   <dbl> <int> <int>
#> 1     1     1     2

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Pivot data from long to wide。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。