Как работает соглашение names_to '.value для нескольких наблюдений на строку в pivot_longer? - PullRequest
2 голосов
/ 23 апреля 2020

Недавний ответ SO, бесстыдно скопированный, использовал dplyr :: pivot_longer для обработки 6 переменных в три.

Я могу понять логи c для всех аргументов pivot_longer, за исключением names to '.values' вход.

Я могу понять, что он делает: он создает новые имена переменных на основе первого выражения регулярного выражения в скобках в аргументе 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+)')

1 Ответ

2 голосов
/ 23 апреля 2020

Исходный код , .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]] выберет столбцы, кроме идентификатора и типа, которые затем можно переименовать с помощью names_pattern. Поскольку имена имеют формат age2000, names_pattern разбивает age2000, например, на age и 2000, причем последнее принимает year, тогда как .value гарантирует, что первое сохраняет то, что выходит из регулярного выражения ( возраст здесь).

...