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


R tidyr pivot_longer 將數據從寬轉為長


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

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

用法

pivot_longer(
  data,
  cols,
  ...,
  cols_vary = "fastest",
  names_to = "name",
  names_prefix = NULL,
  names_sep = NULL,
  names_pattern = NULL,
  names_ptypes = NULL,
  names_transform = NULL,
  names_repair = "check_unique",
  values_to = "value",
  values_drop_na = FALSE,
  values_ptypes = NULL,
  values_transform = NULL
)

參數

data

要旋轉的 DataFrame 。

cols

< tidy-select > 要轉換為更長格式的列。

...

傳遞給方法的附加參數。

cols_vary

當將 cols 轉換為更長的格式時,輸出行應如何相對於其原始行號排列?

  • "fastest"(默認值)將 cols 中的各個行在輸出中保持靠近在一起。當 data 中至少有一個不參與旋轉過程的鍵列時,這通常會產生直觀的有序輸出。

  • "slowest"cols 中的各個列在輸出中緊密結合在一起。當您在旋轉過程中使用 data 中的所有列時,這通常會產生直觀有序的輸出。

names_to

一個字符向量,指定要根據 cols 指定的 data 的列名稱中存儲的信息創建的新列。

  • 如果長度為 0,或者提供NULL,則不會創建任何列。

  • 如果長度為 1,將創建一個列,其中包含 cols 指定的列名稱。

  • 如果長度 >1,將創建多列。在這種情況下,必須提供 names_sepnames_pattern 之一來指定如何拆分列名。您還可以利用兩個額外的字符值:

    • NA 將丟棄列名的相應組成部分。

    • ".value" 表示列名稱的相應組件定義包含單元格值的輸出列的名稱,完全覆蓋values_to

names_prefix

用於從每個變量名稱開頭刪除匹配文本的正則表達式。

names_sep, names_pattern

如果 names_to 包含多個值,這些參數控製列名的分解方式。

names_sep 采用與 separate() 相同的規範,並且可以是數字向量(指定要中斷的位置),也可以是單個字符串(指定要拆分的正則表達式)。

names_pattern 采用與 extract() 相同的規範,即包含匹配組的正則表達式 (() )。

如果這些參數沒有給您足夠的控製權,請使用 pivot_longer_spec() 創建規範對象並根據需要手動處理。

names_ptypes, values_ptypes

(可選)列 name-prototype 對的列表。或者,可以提供一個空原型,它將應用於所有列。原型(或簡稱 ptype)是一個零長度向量(如 integer()numeric() ),它定義向量的類型、類和屬性。如果您想確認創建的列是您期望的類型,請使用這些參數。請注意,如果您想更改(而不是確認)特定列的類型,則應使用names_transformvalues_transform 代替。

names_transform, values_transform

(可選)列 name-function 對的列表。或者,可以提供單個函數,該函數將應用於所有列。如果需要更改特定列的類型,請使用這些參數。例如,names_transform = list(week = as.integer) 會將名為 week 的字符變量轉換為整數。

如果未指定,names_to 生成的列的類型將為字符,values_to 生成的變量的類型將為用於生成它們的輸入列的通用類型。

names_repair

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

values_to

一個字符串,指定要根據單元格值中存儲的數據創建的列的名稱。如果names_to是包含特殊.value標記的字符,則該值將被忽略,並且值列的名稱將從部分現有列名稱派生。

values_drop_na

如果 TRUE ,將刪除 value_to 列中僅包含 NA 的行。這有效地將顯式缺失值轉換為隱式缺失值,通常僅當 data 中的缺失值由其結構創建時才使用。

細節

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

例子

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

# Simplest case where column names are character data
relig_income
#> # A tibble: 18 × 11
#>    relig…¹ `<$10k` $10-2…² $20-3…³ $30-4…⁴ $40-5…⁵ $50-7…⁶ $75-1…⁷ $100-…⁸
#>    <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#>  1 Agnost…      27      34      60      81      76     137     122     109
#>  2 Atheist      12      27      37      52      35      70      73      59
#>  3 Buddhi…      27      21      30      34      33      58      62      39
#>  4 Cathol…     418     617     732     670     638    1116     949     792
#>  5 Don’t …      15      14      15      11      10      35      21      17
#>  6 Evange…     575     869    1064     982     881    1486     949     723
#>  7 Hindu         1       9       7       9      11      34      47      48
#>  8 Histor…     228     244     236     238     197     223     131      81
#>  9 Jehova…      20      27      24      24      21      30      15      11
#> 10 Jewish       19      19      25      25      30      95      69      87
#> 11 Mainli…     289     495     619     655     651    1107     939     753
#> 12 Mormon       29      40      48      51      56     112      85      49
#> 13 Muslim        6       7       9      10       9      23      16       8
#> 14 Orthod…      13      17      23      32      32      47      38      42
#> 15 Other …       9       7      11      13      13      14      18      14
#> 16 Other …      20      33      40      46      49      63      46      40
#> 17 Other …       5       2       3       4       2       7       3       4
#> 18 Unaffi…     217     299     374     365     341     528     407     321
#> # … with 2 more variables: `>150k` <dbl>, `Don't know/refused` <dbl>, and
#> #   abbreviated variable names ¹religion, ²`$10-20k`, ³`$20-30k`,
#> #   ⁴`$30-40k`, ⁵`$40-50k`, ⁶`$50-75k`, ⁷`$75-100k`, ⁸`$100-150k`
relig_income %>%
  pivot_longer(!religion, names_to = "income", values_to = "count")
#> # A tibble: 180 × 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k                 27
#>  2 Agnostic $10-20k               34
#>  3 Agnostic $20-30k               60
#>  4 Agnostic $30-40k               81
#>  5 Agnostic $40-50k               76
#>  6 Agnostic $50-75k              137
#>  7 Agnostic $75-100k             122
#>  8 Agnostic $100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # … with 170 more rows

# Slightly more complex case where columns have common prefix,
# and missing missings are structural so should be dropped.
billboard
#> # A tibble: 317 × 79
#>    artist track date.ent…¹   wk1   wk2   wk3   wk4   wk5   wk6   wk7   wk8
#>    <chr>  <chr> <date>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1 2 Pac  Baby… 2000-02-26    87    82    72    77    87    94    99    NA
#>  2 2Ge+h… The … 2000-09-02    91    87    92    NA    NA    NA    NA    NA
#>  3 3 Doo… Kryp… 2000-04-08    81    70    68    67    66    57    54    53
#>  4 3 Doo… Loser 2000-10-21    76    76    72    69    67    65    55    59
#>  5 504 B… Wobb… 2000-04-15    57    34    25    17    17    31    36    49
#>  6 98^0   Give… 2000-08-19    51    39    34    26    26    19     2     2
#>  7 A*Tee… Danc… 2000-07-08    97    97    96    95   100    NA    NA    NA
#>  8 Aaliy… I Do… 2000-01-29    84    62    51    41    38    35    35    38
#>  9 Aaliy… Try … 2000-03-18    59    53    38    28    21    18    16    14
#> 10 Adams… Open… 2000-08-26    76    76    74    69    68    67    61    58
#> # … with 307 more rows, 68 more variables: wk9 <dbl>, wk10 <dbl>,
#> #   wk11 <dbl>, wk12 <dbl>, wk13 <dbl>, wk14 <dbl>, wk15 <dbl>,
#> #   wk16 <dbl>, wk17 <dbl>, wk18 <dbl>, wk19 <dbl>, wk20 <dbl>,
#> #   wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>, wk25 <dbl>,
#> #   wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
#> #   wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>,
#> #   wk36 <dbl>, wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, …
billboard %>%
  pivot_longer(
    cols = starts_with("wk"),
    names_to = "week",
    names_prefix = "wk",
    values_to = "rank",
    values_drop_na = TRUE
  )
#> # A tibble: 5,307 × 5
#>    artist  track                   date.entered week   rank
#>    <chr>   <chr>                   <date>       <chr> <dbl>
#>  1 2 Pac   Baby Don't Cry (Keep... 2000-02-26   1        87
#>  2 2 Pac   Baby Don't Cry (Keep... 2000-02-26   2        82
#>  3 2 Pac   Baby Don't Cry (Keep... 2000-02-26   3        72
#>  4 2 Pac   Baby Don't Cry (Keep... 2000-02-26   4        77
#>  5 2 Pac   Baby Don't Cry (Keep... 2000-02-26   5        87
#>  6 2 Pac   Baby Don't Cry (Keep... 2000-02-26   6        94
#>  7 2 Pac   Baby Don't Cry (Keep... 2000-02-26   7        99
#>  8 2Ge+her The Hardest Part Of ... 2000-09-02   1        91
#>  9 2Ge+her The Hardest Part Of ... 2000-09-02   2        87
#> 10 2Ge+her The Hardest Part Of ... 2000-09-02   3        92
#> # … with 5,297 more rows

# Multiple variables stored in column names
who %>% pivot_longer(
  cols = new_sp_m014:newrel_f65,
  names_to = c("diagnosis", "gender", "age"),
  names_pattern = "new_?(.*)_(.)(.*)",
  values_to = "count"
)
#> # A tibble: 405,440 × 8
#>    country     iso2  iso3   year diagnosis gender age   count
#>    <chr>       <chr> <chr> <dbl> <chr>     <chr>  <chr> <dbl>
#>  1 Afghanistan AF    AFG    1980 sp        m      014      NA
#>  2 Afghanistan AF    AFG    1980 sp        m      1524     NA
#>  3 Afghanistan AF    AFG    1980 sp        m      2534     NA
#>  4 Afghanistan AF    AFG    1980 sp        m      3544     NA
#>  5 Afghanistan AF    AFG    1980 sp        m      4554     NA
#>  6 Afghanistan AF    AFG    1980 sp        m      5564     NA
#>  7 Afghanistan AF    AFG    1980 sp        m      65       NA
#>  8 Afghanistan AF    AFG    1980 sp        f      014      NA
#>  9 Afghanistan AF    AFG    1980 sp        f      1524     NA
#> 10 Afghanistan AF    AFG    1980 sp        f      2534     NA
#> # … with 405,430 more rows

# Multiple observations per row. Since all columns are used in the pivoting
# process, we'll use `cols_vary` to keep values from the original columns
# close together in the output.
anscombe
#>    x1 x2 x3 x4    y1   y2    y3    y4
#> 1  10 10 10  8  8.04 9.14  7.46  6.58
#> 2   8  8  8  8  6.95 8.14  6.77  5.76
#> 3  13 13 13  8  7.58 8.74 12.74  7.71
#> 4   9  9  9  8  8.81 8.77  7.11  8.84
#> 5  11 11 11  8  8.33 9.26  7.81  8.47
#> 6  14 14 14  8  9.96 8.10  8.84  7.04
#> 7   6  6  6  8  7.24 6.13  6.08  5.25
#> 8   4  4  4 19  4.26 3.10  5.39 12.50
#> 9  12 12 12  8 10.84 9.13  8.15  5.56
#> 10  7  7  7  8  4.82 7.26  6.42  7.91
#> 11  5  5  5  8  5.68 4.74  5.73  6.89
anscombe %>%
  pivot_longer(
    everything(),
    cols_vary = "slowest",
    names_to = c(".value", "set"),
    names_pattern = "(.)(.)"
  )
#> # A tibble: 44 × 3
#>    set       x     y
#>    <chr> <dbl> <dbl>
#>  1 1        10  8.04
#>  2 1         8  6.95
#>  3 1        13  7.58
#>  4 1         9  8.81
#>  5 1        11  8.33
#>  6 1        14  9.96
#>  7 1         6  7.24
#>  8 1         4  4.26
#>  9 1        12 10.8 
#> 10 1         7  4.82
#> # … with 34 more rows
源代碼:R/pivot-long.R

相關用法


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