r语言 - names_to '.value'约定如何适用于pivot_longer中每行的多个观测值?



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

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

我可以计算出它的作用:它基于names_pattern参数中第一个带括号的正则表达式创建新的变量名。

我的问题是".values"是如何运作的?

我可以看到它在"每行多个观测值"的pivot_langer函数示例部分中使用;但是在该示例中没有给出解释。

感觉它可能是一个正则表达式选项.表示匹配除\n;还是它是一种"代词"类型的输出,在"tidyverse"中似乎很常见,意思是"regex表达式的输出或值"?

任何关于如何理解pivot_langer复杂性的信息的指南或指针都将不胜感激。

或者这只是一个对功能进行实验并了解它的作用的例子?

链接到原始问题:[使用多列和多个值调整更长的

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+)')

根据源代码,.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和类型之外的列,然后可以用names_pattern重命名这些列。由于名称的格式为age2000names_patternage2000分解为age2000,后者取year,而.value确保前者保留正则表达式中的内容(此处为age(。

最新更新