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_from
和values_from
指定的列除外。如果提供 tidyselect 表達式,則在刪除通過names_from
和values_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_from
或values_from
包含多個變量,這將用於將它們的值連接到單個字符串中以用作列名稱。 - names_glue
-
您可以提供使用
names_from
列(和特殊的.value
)來創建自定義列名稱的粘合規範,而不是names_sep
和names_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_cols
和names_from
列的組合不能唯一標識觀測值時,您通常會使用此選項。如果您想將不同的聚合應用於不同的
values_from
列,這可以是命名列表。 - unused_fn
-
(可選)應用一個函數來匯總未使用列(即未由
id_cols
、names_from
或values_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 tidyr pivot_wider_spec 使用規範將數據從長軸轉向寬軸
- R tidyr pivot_longer_spec 使用規範將數據從寬轉為長
- R tidyr pivot_longer 將數據從寬轉為長
- 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 long to wide。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。