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_sep
或names_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_transform
或values_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 tidyr pivot_longer_spec 使用規範將數據從寬轉為長
- R tidyr pivot_wider_spec 使用規範將數據從長軸轉向寬軸
- R tidyr pivot_wider 將數據從長軸轉向寬軸
- R tidyr pack 打包和拆包
- R tidyr separate_rows 將折疊的列分成多行
- R tidyr extract 使用正則表達式組將字符列提取為多列
- R tidyr chop 砍伐和砍伐
- R tidyr unnest_longer 將列表列取消嵌套到行中
- R tidyr uncount “計數” DataFrame
- R tidyr cms_patient_experience 來自醫療保險和醫療補助服務中心的數據
- R tidyr replace_na 將 NA 替換為指定值
- R tidyr unnest_wider 將列表列取消嵌套到列中
- R tidyr full_seq 在向量中創建完整的值序列
- R tidyr nest 將行嵌套到 DataFrame 的列表列中
- R tidyr separate 使用正則表達式或數字位置將字符列分成多列
- R tidyr nest_legacy Nest() 和 unnest() 的舊版本
- R tidyr separate_longer_delim 將字符串拆分為行
- R tidyr gather 將列收集到鍵值對中
- R tidyr hoist 將值提升到列表列之外
- R tidyr separate_wider_delim 將字符串拆分為列
- R tidyr drop_na 刪除包含缺失值的行
- R tidyr fill 用上一個或下一個值填充缺失值
- R tidyr tidyr_legacy 舊名稱修複
- R tidyr complete 完成缺少數據組合的 DataFrame
- R tidyr expand 擴展 DataFrame 以包含所有可能的值組合
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Pivot data from wide to long。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。