Сбор широких столбцов в несколько длинных столбцов с помощью pivot_longer - часть 2 - PullRequest
1 голос
/ 04 октября 2019

У меня все еще возникают проблемы с использованием pivot_longer для объединения нескольких столбцов в несколько длинных столбцов, а не столбец за столбцом (продолжение «Сбор широких столбцов в несколько длинных столбцов с помощью pivot_longer).

Напримерстолбцы hf_1, hf_2, hf_3, hf_4, hf_5, hf_6 необходимо развернуть в 2 столбца (hf_com - этот столбец со значениями 1,2,3,4,5,6 из широких столбцов hf) и (hf_com_freq - этот столбецсо значением 1).

То же самое должно произойти для столбцов ac_1, ac_2, ac_3, ac_4, ac_5, ac_6. Эти столбцы необходимо объединить в 2 столбца (ac_com - этот столбец со значениями 1,2,3,4,5,6 от широких столбцов ac) и (ac_com_freq - этот столбец со значением 1).

Iпопробовал посмотреть:

Собрать несколько наборов столбцов

и:

Преобразовать несколько наборов столбцов измерений (в широком формате) водиночные столбцы (длинный формат)

и пример набора данных who в:

https://tidyr.tidyverse.org/articles/pivot.html

, но я не могу получить значения в кратном дольшестолбцы, которые мне нужны.

Вот входные данные из набора игрушечных данных:

df1 <- tribble(
  ~"np_id", ~"np_city_size", ~"cc_hf_1", ~"cc_hf_2", ~"cc_hf_3", ~"cc_hf_4", ~"cc_hf_5", ~"cc_hf_6", ~"cc_ac_1", ~"cc_ac_2", ~"cc_ac_3", ~"cc_ac_4", ~"cc_ac_5", ~"cc_ac_6",
  "81", "village", NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA,
  "82", "village", 1L, NA, NA, NA, 1L, NA, NA, NA, NA, 1L, NA, NA,
  "83", "more than 500k inhabitants", NA, 1L, NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA,
  "85", "more than 500k inhabitants", NA, 1L, NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA,
  "87", "more than 500k inhabitants", NA, 1L, NA, NA, NA, NA, NA, NA, 1L, NA, NA, NA,
  "89", "village", 1L, NA, NA, 1L, NA, NA, 1L, NA, NA, NA, NA, NA,
  "90", "village", 1L, NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA,
  "91", "village", 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, NA,
  "92", "village", NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, 1L
)

Это код, который у меня есть в данный момент:

df_longer <- df1 %>% pivot_longer(
  cols = -(starts_with("np_")),
  names_to = c("hf_com", "ac_com"), 
  names_pattern = "cc_?(.*)_(.*)",
  values_to = c("hf_com_freq", "ac_com_freq")
)

ОднакоЯ знаю, что мне нужно извлечь последний символ в заголовке столбца (например, 1 из hf_ 1 2 из hf_ 2) и передать его в качестве значения .value для каждого столбца, но у меня возникли проблемы с использованиемрегулярные выражения и параметры pivot_longer, такие как names_patterns, чтобы решить эту проблему. Я чувствую, что я очень близок к решению, но не вижу леса за деревьями !!!!

Вот фактические результаты:

df_longer <- structure(list(np_id = c("81", "81", "81", "81", "81", "81"), 
    np_city_size = c("village", "village", "village", "village", 
    "village", "village"), hf_com = c("hf", "hf", "hf", "hf", 
    "hf", "hf"), ac_com = c("1", "2", "3", "4", "5", "6"), hf_com_freq = c(NA, 
    NA, 1L, NA, NA, NA), ac_com_freq = c(NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

Вот ожидаемые результаты:

df_longer <- structure(list(np_id = c("81", "81", "81", "81", "81", "81"), 
    np_city_size = c("village", "village", "village", "village", 
    "village", "village"), hf_com = c("1", "2", "3", "4", 
    "5", "6"), ac_com = c("1", "2", "3", "4", "5", "6"), hf_com_freq = c(NA, 
    NA, 1L, NA, NA, NA), ac_com_freq = c(NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
...