最近的一个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+)')
根据源代码,.value
将values_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
重命名这些列。由于名称的格式为age2000
,names_pattern
将age2000
分解为age
和2000
,后者取year
,而.value
确保前者保留正则表达式中的内容(此处为age(。