Pivot_longer () для нескольких наборов столбцов в dplyr

У меня есть друг с широким фреймом данных, и я хотел бы выполнить pivot_longer () для нескольких наборов столбцов. Ниже приведен минимальный пример фрейма данных:

id <- c(303, 303)
year <- c(2020, 2020) 
city_a <- c("Madrid", "Madrid") 
PA1 = c("AA", "AA") 
a1_x <- c(475, 457) 
a1_y = c(576, 576) 
PA2 = c("BB", "BB") 
a2_x = c(746, 756) 
a2_y = c(465, 475)
PA3 = c("CC", "CC") 
a3_x = c(546, 756) 
a3_y = c(574, 867) 
PA4 = c("DD", "DD") 
a4_x = c(463, 875) 
a4_y = c(565, 576) 
PA5 = c("EE", "EE") 
a5_x = c(564, 746) 
a5_y= c(576, 576) 
city_h = c("Chicago", "Chicago") 
PH1 = c("FF", "FF") 
h1_x = c(475, 475) 
h1_y = c(576, 745) 
PH2 = c("HH", "HH") 
h2_x = c(746, 475) 
h2_y = c(465, 465) 
PH3 = c("JJ", "JJ")
h3_x = c(546, 475) 
h3_y = c(574, 475) 
PH4 = c("KK", "KK") 
h4_x = c(463, 756) 
h4_y = c(565, 586) 
PH5 = c("MM", "MM")
h5_x = c(564, 456) 
h5_y = c(576, 586) 
vue_x = c(365, 465) 
vue_y = c(846, 475) 
vue_z = c(465, 845)


data <- data.frame(id, year, city_a, PA1, a1_x, a1_y, PA2, a2_x, a2_y, PA3, a3_x, a3_y, PA4, a4_x, a4_y, PA5, a5_x, a5_y, city_h, PH1, h1_x, h1_y, PH2, h2_x, h2_y, PH3, h3_x, h3_y, PH4, h4_x, h4_y, PH5, h5_x, h5_y, vue_x, vue_y, vue_z)

Я хотел бы изменить окончательный фрейм данных, чтобы он имел следующий формат:

id
год
City: собирает столбцы city_a и city_h Person: собирает столбцы, начинающиеся с PA или PH
x: собирает столбцы с шаблоном _x
y: собирает столбцы с шаблоном _y
z: показывает столбец данных deom _z

Надеюсь, объяснение имеет смысл. Я пробовал примеры изменения решения здесь https://community.rstudio.com/t/pivot-longer-on-multiple-column-sets-pairs/43958/7, но не удалось.


person Jdv    schedule 10.08.2020    source источник
comment
Не могли бы вы показать, как должен выглядеть ваш ожидаемый результат на основе предоставленных вами данных?   -  person Martin Gal    schedule 10.08.2020
comment
Я полагаю, PH5, h5_x, h5_y принадлежат друг другу, и они принадлежат chicago, где PA1, a1_x, a1_y вместе madrid. А как насчет vue_*? А как данные разделяются?   -  person Martin Gal    schedule 10.08.2020
comment
Нам определенно нужно увидеть желаемый результат, чтобы оказать помощь. Но я бы предположил, что это, вероятно, тот случай, когда вы pivot_longer все, кроме id и года, разделяете столбцы на нужные заголовки, а затем pivot_wider, чтобы добраться туда, где вы хотите быть.   -  person Adam Sampson    schedule 10.08.2020
comment
Привет, Мартин, спасибо. Да, как вы сказали, они принадлежат друг другу. Возможно, вместо того, чтобы иметь столбцы x и y, лучше было бы иметь столбец координат, в котором мы могли бы иметь значения x и y, а также значения x, y и z для vue.   -  person Jdv    schedule 10.08.2020
comment
Пожалуйста, покажите ожидаемый результат. Я не уверен, как это должно выглядеть.   -  person Martin Gal    schedule 10.08.2020
comment
Мартин, я указал выше. Мне нужны столбцы (id, год, город, человек, x, y, z).   -  person Jdv    schedule 10.08.2020
comment
Вы не указали полностью. У вас есть PA1 и PH1 подряд. Разделяются ли они по разным строкам, чтобы у каждого идентификатора были строки для каждого PA или PH? Как насчет того, чтобы вручную преобразовать ваши данные в то, что вы хотите видеть, и отредактировать исходный пост вместо того, чтобы предполагать, что мы сможем понять, что вы хотите, после того, как сказали вам, что мы не можем.   -  person Adam Sampson    schedule 10.08.2020


Ответы (1)


Как люди сказали вам в комментарии, ваш ожидаемый результат не так ясен.

Вот что я понял о вашей проблеме. Если это не то, чего вы ожидаете, я надеюсь, что это, по крайней мере, заставит вас понять, что неясно в вашем вопросе.

data %>% 
    pivot_longer(starts_with("city"), 
                 names_to="city_name", values_to="city") %>%
    pivot_longer(c(starts_with("PA"), starts_with("PH")), 
                 names_to="person_name", values_to="person") %>%
    pivot_longer(ends_with("_x"), 
                 names_to="x_name", values_to="x") %>%
    pivot_longer(ends_with("_y"), 
                 names_to="y_name", values_to="y") %>%
    pivot_longer(ends_with("_z"), 
                 names_to="z_name", values_to="z") %>%
    # select(-ends_with("_name")) %>% #uncomment this line to remove the names for good
    identity()

Который дает:

# # A tibble: 4,840 x 12
#       id  year city_name city   person_name person x_name     x y_name     y z_name     z
#    <dbl> <dbl> <chr>     <fct>  <chr>       <fct>  <chr>  <dbl> <chr>  <dbl> <chr>  <dbl>
# 1    303  2020 city_a    Madrid PA1         AA     a1_x     475 a1_y     576 vue_z    465
# 2    303  2020 city_a    Madrid PA1         AA     a1_x     475 a2_y     465 vue_z    465
# 3    303  2020 city_a    Madrid PA1         AA     a1_x     475 a3_y     574 vue_z    465
# 4    303  2020 city_a    Madrid PA1         AA     a1_x     475 a4_y     565 vue_z    465
# 5    303  2020 city_a    Madrid PA1         AA     a1_x     475 a5_y     576 vue_z    465
# 6    303  2020 city_a    Madrid PA1         AA     a1_x     475 h1_y     576 vue_z    465
# 7    303  2020 city_a    Madrid PA1         AA     a1_x     475 h2_y     465 vue_z    465
# 8    303  2020 city_a    Madrid PA1         AA     a1_x     475 h3_y     574 vue_z    465
# 9    303  2020 city_a    Madrid PA1         AA     a1_x     475 h4_y     565 vue_z    465
# 10   303  2020 city_a    Madrid PA1         AA     a1_x     475 h5_y     576 vue_z    465
# # ... with 4,830 more rows
person Dan Chaltiel    schedule 10.08.2020