r - names_to '.value' 约定如何适用于 pivot_longer 中每行的多个观察值?
问题描述
最近的一个 SO 答案,无耻地复制,使用 dplyr::pivot_longer 将 6 个变量处理为三个。
names to
'.values'
我可以理解除输入之外的所有 pivot_longer 参数的逻辑。
我可以弄清楚它的作用:它根据参数中第一个带括号的正则表达式创建新的变量名names_pattern
。
我的问题是“.values”是如何工作的?
我可以看到它在“每行多个观察值”的 pivot_longer 函数示例部分中使用;但示例中没有给出解释。
感觉好像它可能是一个正则表达式选项.
意味着匹配除 \n 之外的任何字符;或者它是一种“代词”类型的输出,在“tidyverse”中似乎很常见,意思是“正则表达式的输出或值”?
任何可以在哪里找到有关如何理解 pivot_longer 复杂性的信息的指导或指针将不胜感激。
或者这只是一个试验函数并理解它的作用的例子?
链接到原始问题:[使用多个列和值进行更长时间的旋转
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 和 type 之外的列,然后可以使用names_pattern
. 由于名称采用 format age2000
,因此后者的names_pattern
中断age2000
例如age
和2000
后者year
同时.value
确保前者保留正则表达式(此处的年龄)的内容。
推荐阅读
- c - 为什么 type arrayp[] 与 type* arrayp 作为函数的参数相同?
- r - 在 R 包目录结构中在哪里包含文本注释?
- ruby-on-rails - 将rails从3升级到5时如何替换prototype-rails gem?
- java - 为什么通过查看源代码获取 html 代码与使用 Java 代码不同?
- flutter - Flutter - 如何验证 InAppPurchases (iOS)
- mysql - count 数据库行返回 null 而不是 0
- image-processing - 用于 CNN 的适当 DICOM 图像预处理 - 具有不同模态和光度解释的图像
- php - 为什么 SQL 查询不能通过并报错?
- flutter - 使用 Flutter 实现汽车加速和减速
- django - 如何创建包含动态变量的列表