当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dbplyr pivot_wider.tbl_lazy 将数据从长轴转向宽轴


pivot_wider() "widens"数据,增加列数并减少行数。逆变换为 pivot_longer() 。在vignette("pivot", "tidyr") 中了解更多信息。

请注意,pivot_wider() 不是也不可能是懒惰的,因为我们需要查看数据来确定新的列名是什么。

用法

# S3 method for tbl_lazy
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 = ~max(.x, na.rm = TRUE),
  unused_fn = NULL
)

参数

data

由数据库查询支持的惰性 DataFrame 。

...

没用过;包含在内是为了与通用兼容。

id_cols

唯一标识每个观察值的一组列。

id_expand

没用过;包含在内是为了与通用兼容。

names_from, values_from

一对参数,说明从哪一列(或多列)获取输出列的名称 ( names_from ),以及从哪一列(或多列)获取单元格值 ( values_from )。

如果values_from包含多个值,该值将被添加到输出列的前面。

names_prefix

添加到每个变量名称开头的字符串。

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

如果输出具有无效的列名称,会发生什么情况?

values_fill

(可选)一个(标量)值,指定每个 value 在缺失时应填充的内容。

values_fn

一个函数,默认为 max() ,应用于输出中每个单元格中的value。与本地数据帧相反,它不能是 NULL

unused_fn

(可选)应用一个函数来汇总未使用列(即未由 id_colsnames_fromvalues_from 标识的列)中的值。

默认情况下会从结果中删除所有未使用的列。

如果您想将不同的聚合应用于不同的未使用列,这可以是命名列表。

必须提供 id_cols 才能使 unused_fn 有用,否则所有未指定的列都将被视为 id_cols

这类似于按 id_cols 进行分组,然后使用 unused_fn 汇总未使用的列。

细节

本地数据帧与 pivot_wider() 的最大区别在于 values_fn 不能是 NULL 。默认情况下,如果 id_colsvalue 列的组合唯一标识一个观察值,则 max() 会产生与本地数据帧相同的结果。请注意,如果观察结果未唯一标识,您也不会收到警告。

SQL 代码的翻译本质上如下:

  1. 获取 names_from 列中的唯一键。

  2. 对于每个键值生成以下形式的表达式:

    value_fn(
      CASE WHEN (`names from column` == `key value`)
      THEN (`value column`)
      END
    ) AS `output column`
  3. 按 id 列对数据进行分组。

  4. 使用步骤 2 中的表达式汇总分组数据。

例子

memdb_frame(
  id = 1,
  key = c("x", "y"),
  value = 1:2
) %>%
  tidyr::pivot_wider(
    id_cols = id,
    names_from = key,
    values_from = value
  )
#> # Source:   SQL [1 x 3]
#> # Database: sqlite 3.41.2 [:memory:]
#>      id     x     y
#>   <dbl> <int> <int>
#> 1     1     1     2

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Pivot data from long to wide。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。