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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。