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


R tidyr pivot_wider 將數據從長軸轉向寬軸


pivot_wider() "widens"數據,增加列數並減少行數。逆變換為 pivot_longer()

vignette("pivot") 中了解更多信息。

用法

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 = NULL,
  unused_fn = NULL
)

參數

data

要旋轉的 DataFrame 。

...

傳遞給方法的附加參數。

id_cols

< tidy-select > 唯一標識每個觀察值的一組列。通常在有冗餘變量(即其值與現有變量完全相關的變量)時使用。

默認為 data 中的所有列,但通過 names_fromvalues_from 指定的列除外。如果提供 tidyselect 表達式,則在刪除通過 names_fromvalues_from 指定的列後,將在 data 上對其求值。

id_expand

在旋轉之前,id_cols 列中的值是否應該擴展expand()?這會產生更多行,輸出將包含 id_cols 中所有可能值的完整擴展。數據中未表示的隱性因子水平將變得顯性。此外,與擴展的id_cols對應的行值將被排序。

names_from, values_from

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

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

names_prefix

添加到每個變量名稱開頭的字符串。如果 names_from 是數值向量並且您想要創建語法變量名稱,這尤其有用。

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

如果輸出具有無效的列名稱,會發生什麽情況?默認情況下,如果列重複,"check_unique" 將出錯。使用 "minimal" 允許輸出中存在重複項,或使用 "unique" 通過添加數字後綴來消除重複項。有關更多選項,請參閱vctrs::vec_as_names()

values_fill

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

如果您想將不同的填充值應用於不同的值列,這可以是命名列表。

values_fn

(可選)應用於輸出中每個單元格中的值的函數。當 id_colsnames_from 列的組合不能唯一標識觀測值時,您通常會使用此選項。

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

unused_fn

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

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

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

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

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

細節

pivot_wider()spread() 的更新方法,旨在更易於使用並處理更多用例。我們建議您使用pivot_wider()作為新代碼; spread() 不會消失,但不再處於積極開發狀態。

也可以看看

pivot_wider_spec() 使用定義旋轉規範的 DataFrame 來旋轉 "by hand"。

例子

# See vignette("pivot") for examples and explanation

fish_encounters
#> # A tibble: 114 × 3
#>    fish  station  seen
#>    <fct> <fct>   <int>
#>  1 4842  Release     1
#>  2 4842  I80_1       1
#>  3 4842  Lisbon      1
#>  4 4842  Rstr        1
#>  5 4842  Base_TD     1
#>  6 4842  BCE         1
#>  7 4842  BCW         1
#>  8 4842  BCE2        1
#>  9 4842  BCW2        1
#> 10 4842  MAE         1
#> # … with 104 more rows
fish_encounters %>%
  pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 × 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA
#>  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA
#>  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA
#>  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#>  8 4850        1     1     NA     1       1     1     1    NA    NA    NA
#>  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 11 4855        1     1      1     1       1    NA    NA    NA    NA    NA
#> 12 4857        1     1      1     1       1     1     1     1     1    NA
#> 13 4858        1     1      1     1       1     1     1     1     1     1
#> 14 4859        1     1      1     1       1    NA    NA    NA    NA    NA
#> 15 4861        1     1      1     1       1     1     1     1     1     1
#> 16 4862        1     1      1     1       1     1     1     1     1    NA
#> 17 4863        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 18 4864        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 19 4865        1     1      1    NA      NA    NA    NA    NA    NA    NA
#> # … with 1 more variable: MAW <int>
# Fill in missing values
fish_encounters %>%
  pivot_wider(names_from = station, values_from = seen, values_fill = 0)
#> # A tibble: 19 × 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1     0     0     0     0     0
#>  5 4847        1     1      1     0       0     0     0     0     0     0
#>  6 4848        1     1      1     1       0     0     0     0     0     0
#>  7 4849        1     1      0     0       0     0     0     0     0     0
#>  8 4850        1     1      0     1       1     1     1     0     0     0
#>  9 4851        1     1      0     0       0     0     0     0     0     0
#> 10 4854        1     1      0     0       0     0     0     0     0     0
#> 11 4855        1     1      1     1       1     0     0     0     0     0
#> 12 4857        1     1      1     1       1     1     1     1     1     0
#> 13 4858        1     1      1     1       1     1     1     1     1     1
#> 14 4859        1     1      1     1       1     0     0     0     0     0
#> 15 4861        1     1      1     1       1     1     1     1     1     1
#> 16 4862        1     1      1     1       1     1     1     1     1     0
#> 17 4863        1     1      0     0       0     0     0     0     0     0
#> 18 4864        1     1      0     0       0     0     0     0     0     0
#> 19 4865        1     1      1     0       0     0     0     0     0     0
#> # … with 1 more variable: MAW <int>

# Generate column names from multiple variables
us_rent_income
#> # A tibble: 104 × 5
#>    GEOID NAME       variable estimate   moe
#>    <chr> <chr>      <chr>       <dbl> <dbl>
#>  1 01    Alabama    income      24476   136
#>  2 01    Alabama    rent          747     3
#>  3 02    Alaska     income      32940   508
#>  4 02    Alaska     rent         1200    13
#>  5 04    Arizona    income      27517   148
#>  6 04    Arizona    rent          972     4
#>  7 05    Arkansas   income      23789   165
#>  8 05    Arkansas   rent          709     5
#>  9 06    California income      29454   109
#> 10 06    California rent         1358     3
#> # … with 94 more rows
us_rent_income %>%
  pivot_wider(
    names_from = variable,
    values_from = c(estimate, moe)
  )
#> # A tibble: 52 × 6
#>    GEOID NAME                 estimate_income estimate_r…¹ moe_i…² moe_r…³
#>    <chr> <chr>                          <dbl>        <dbl>   <dbl>   <dbl>
#>  1 01    Alabama                        24476          747     136       3
#>  2 02    Alaska                         32940         1200     508      13
#>  3 04    Arizona                        27517          972     148       4
#>  4 05    Arkansas                       23789          709     165       5
#>  5 06    California                     29454         1358     109       3
#>  6 08    Colorado                       32401         1125     109       5
#>  7 09    Connecticut                    35326         1123     195       5
#>  8 10    Delaware                       31560         1076     247      10
#>  9 11    District of Columbia           43198         1424     681      17
#> 10 12    Florida                        25952         1077      70       3
#> # … with 42 more rows, and abbreviated variable names ¹estimate_rent,
#> #   ²moe_income, ³moe_rent

# You can control whether `names_from` values vary fastest or slowest
# relative to the `values_from` column names using `names_vary`.
us_rent_income %>%
  pivot_wider(
    names_from = variable,
    values_from = c(estimate, moe),
    names_vary = "slowest"
  )
#> # A tibble: 52 × 6
#>    GEOID NAME                 estimate_income moe_income estimat…¹ moe_r…²
#>    <chr> <chr>                          <dbl>      <dbl>     <dbl>   <dbl>
#>  1 01    Alabama                        24476        136       747       3
#>  2 02    Alaska                         32940        508      1200      13
#>  3 04    Arizona                        27517        148       972       4
#>  4 05    Arkansas                       23789        165       709       5
#>  5 06    California                     29454        109      1358       3
#>  6 08    Colorado                       32401        109      1125       5
#>  7 09    Connecticut                    35326        195      1123       5
#>  8 10    Delaware                       31560        247      1076      10
#>  9 11    District of Columbia           43198        681      1424      17
#> 10 12    Florida                        25952         70      1077       3
#> # … with 42 more rows, and abbreviated variable names ¹estimate_rent,
#> #   ²moe_rent

# When there are multiple `names_from` or `values_from`, you can use
# use `names_sep` or `names_glue` to control the output variable names
us_rent_income %>%
  pivot_wider(
    names_from = variable,
    names_sep = ".",
    values_from = c(estimate, moe)
  )
#> # A tibble: 52 × 6
#>    GEOID NAME                 estimate.income estimate.r…¹ moe.i…² moe.r…³
#>    <chr> <chr>                          <dbl>        <dbl>   <dbl>   <dbl>
#>  1 01    Alabama                        24476          747     136       3
#>  2 02    Alaska                         32940         1200     508      13
#>  3 04    Arizona                        27517          972     148       4
#>  4 05    Arkansas                       23789          709     165       5
#>  5 06    California                     29454         1358     109       3
#>  6 08    Colorado                       32401         1125     109       5
#>  7 09    Connecticut                    35326         1123     195       5
#>  8 10    Delaware                       31560         1076     247      10
#>  9 11    District of Columbia           43198         1424     681      17
#> 10 12    Florida                        25952         1077      70       3
#> # … with 42 more rows, and abbreviated variable names ¹estimate.rent,
#> #   ²moe.income, ³moe.rent
us_rent_income %>%
  pivot_wider(
    names_from = variable,
    names_glue = "{variable}_{.value}",
    values_from = c(estimate, moe)
  )
#> # A tibble: 52 × 6
#>    GEOID NAME                 income_estimate rent_estim…¹ incom…² rent_…³
#>    <chr> <chr>                          <dbl>        <dbl>   <dbl>   <dbl>
#>  1 01    Alabama                        24476          747     136       3
#>  2 02    Alaska                         32940         1200     508      13
#>  3 04    Arizona                        27517          972     148       4
#>  4 05    Arkansas                       23789          709     165       5
#>  5 06    California                     29454         1358     109       3
#>  6 08    Colorado                       32401         1125     109       5
#>  7 09    Connecticut                    35326         1123     195       5
#>  8 10    Delaware                       31560         1076     247      10
#>  9 11    District of Columbia           43198         1424     681      17
#> 10 12    Florida                        25952         1077      70       3
#> # … with 42 more rows, and abbreviated variable names ¹rent_estimate,
#> #   ²income_moe, ³rent_moe

# Can perform aggregation with `values_fn`
warpbreaks <- as_tibble(warpbreaks[c("wool", "tension", "breaks")])
warpbreaks
#> # A tibble: 54 × 3
#>    wool  tension breaks
#>    <fct> <fct>    <dbl>
#>  1 A     L           26
#>  2 A     L           30
#>  3 A     L           54
#>  4 A     L           25
#>  5 A     L           70
#>  6 A     L           52
#>  7 A     L           51
#>  8 A     L           26
#>  9 A     L           67
#> 10 A     M           18
#> # … with 44 more rows
warpbreaks %>%
  pivot_wider(
    names_from = wool,
    values_from = breaks,
    values_fn = mean
  )
#> # A tibble: 3 × 3
#>   tension     A     B
#>   <fct>   <dbl> <dbl>
#> 1 L        44.6  28.2
#> 2 M        24    28.8
#> 3 H        24.6  18.8

# Can pass an anonymous function to `values_fn` when you
# need to supply additional arguments
warpbreaks$breaks[1] <- NA
warpbreaks %>%
  pivot_wider(
    names_from = wool,
    values_from = breaks,
    values_fn = ~ mean(.x, na.rm = TRUE)
  )
#> # A tibble: 3 × 3
#>   tension     A     B
#>   <fct>   <dbl> <dbl>
#> 1 L        46.9  28.2
#> 2 M        24    28.8
#> 3 H        24.6  18.8
源代碼:R/pivot-wide.R

相關用法


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