【问题标题】:How does the names_to '.value' convention work for multiple observations per row in pivot_longer?names_to '.value' 约定如何适用于 pivot_longer 中每行的多个观察值?
【发布时间】:2020-04-23 11:31:06
【问题描述】:

最近的一个 SO 答案,无耻地复制,使用 dplyr::pivot_longer 将 6 个变量处理为三个。

除了names to '.values' 输入之外,我可以理解所有 pivot_longer 参数的逻辑。

我可以弄清楚它的作用:它根据names_pattern 参数中第一个带括号的正则表达式创建新的变量名。

我的问题是“.values”是如何工作的?

我可以看到它用于“每行多个观察”的 pivot_longer 函数示例部分;但示例中没有给出解释。

感觉好像它可能是一个正则表达式选项.意味着匹配除\n之外的任何字符;或者它是一种“代词”类型的输出,在“tidyverse”中似乎很常见,意思是“正则表达式的输出或值”?

如果有任何指南或指针可以找到有关如何理解 pivot_longer 复杂性的信息,我们将不胜感激。

或者这只是一个试验函数并理解它的作用的例子?

原始问题的链接:[pivot longer with multiple columns and values

library(tibble)
library(tidyr)


tib <- tibble(type = c(1L, 1L, 1L, 2L, 2L, 2L), 
              id = c(1L, 2L, 3L, 1L, 2L, 3L), 
              age2000 = c(20L, 35L, 24L, 32L, 66L, 14L), 
              age2001 = c(21L, 36L, 25L, 33L, 67L, 15L),
              age2002 = c(22L, 37L, 26L, 34L, 68L, 16L),
              bool2000 = c(1L, 2L, 1L, 2L, 2L, 1L),
              bool2001 = c(1L, 2L, 1L, 2L, 2L, 1L),
              bool2002 = c(1L, 2L, 1L, 2L, 2L, 1L))




pivot_longer(tib,
             cols = -c(id, type), 
             names_to = c('.value', 'year'),
             names_pattern = '([a-z]+)(\\d+)')

【问题讨论】:

  • pivot_long 的文档中声明 .value` 表示名称的组成部分定义了包含单元格值的列的名称,覆盖values_to (您可以浏览source code,根据我的经验,这是一个递归过程)

标签: r tidyr


【解决方案1】:

source code.valuevalues_to 设置为NULL,这样它就不会使用values_to 中的名称,而是使用单元格本身的名称。

如果你看这一行:

 if (".value" %in% names_to) {
    values_to <- NULL
  }

然后:

  out <- tibble(.name = cols)
  out[[".value"]] <- values_to
  out <- vec_cbind(out, names)
  out
}

out[[.value]] 将选择除 id 和 type 之外的列,然后可以使用 names_pattern 重命名。由于名称的格式为age2000,因此names_patternage2000 分解为age2000,后者采用year,而.value 确保前者保留正则表达式的内容(年龄在这里)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多