#r #tidyverse
#r #tidyverse
Вопрос:
Здравствуйте и добрый вечер,
У меня действительно есть проблема с набором данных, которую я, похоже, не могу решить, хотя я пытался часами в R.
Вот минимальный рабочий пример.
library(tidyverse)
mytibble <- tribble(
~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3,
"A" , "postcode" , "A110" , "B220", "Z112",
"A" , "itemssold" , "10" , "20" ,"30",
"B" , "postcode" , "A214" , "C112", NA,
"B" , "itemssold" , "15" , "20" , NA,
"C" , "postcode" , "A221" , NA , NA,
"C" , "itemssold" , "4" , NA , NA)
Как можно видеть, две переменные («почтовый индекс» и «itemssold») определены в переменной «oldvarname». Значения переменных затем могут быть выведены из переменных postcode1 через postcodex.
Вот мой желаемый конечный результат:
goal <- tribble(
~shopid, ~postcode, ~itemssold,
"A" , "A110" , 10,
"A" , "B220" , 20,
"A" , "Z112" , 30,
"B" , "A214" , 15,
"B" , "C112" , 20,
"C" , "A221" , 4)
Я пытался достичь своей цели, работая с pivot_wider() и pivot_longer() (или их комбинацией) из tidyverse, но, похоже, не смог решить мою проблему.
Я был бы бесконечно благодарен за любые полезные комментарии.
Заранее большое вам спасибо,
Мини-мышь
Комментарии:
1. Не уверен, застряли ли вы на tidyverse или нет, но есть несколько довольно подробных виньеток для data.table, иллюстрирующих, как переключиться с длинного формата на широкий формат, см.: cran.r-project.org/web/packages/data.table/vignettes /…
Ответ №1:
вы можете попробовать
mytibble %>%
pivot_longer(-1:-2, names_prefix ="postcode") %>%
pivot_wider(names_from = oldvarname, values_from = value) %>%
filter(complete.cases(.))
# A tibble: 6 x 4
shopid name postcode itemssold
<chr> <chr> <chr> <chr>
1 A 1 A110 10
2 A 2 B220 20
3 A 3 Z112 30
4 B 1 A214 15
5 B 2 C112 20
6 C 1 A221 4
Комментарии:
1. Столбец name должен быть удален в вашем tibble. С этой строкой в вашем коде мой код может показаться немного менее неудобным. 🙂
2. Большое вам спасибо за это разумное решение моей проблемы. Я многому научился. Еще раз спасибо 🙂
Ответ №2:
library(tidyverse)
mytibble <- tribble(
~shopid, ~oldvarname , ~postcode1, ~postcode2, ~postcode3,
"A" , "postcode" , "A110" , "B220", "Z112",
"A" , "itemssold" , "10" , "20" ,"30",
"B" , "postcode" , "A214" , "C112", NA,
"B" , "itemssold" , "15" , "20" , NA,
"C" , "postcode" , "A221" , NA , NA,
"C" , "itemssold" , "4" , NA , NA)
df1 <- mytibble %>%
filter(oldvarname=="postcode") %>%
pivot_longer(
cols = starts_with("postcode"),
names_to = "names",
values_to = "postcode"
) %>%
select(-oldvarname, -names) %>%
drop_na()
df2 <- mytibble %>%
filter(oldvarname=="itemssold") %>%
pivot_longer(
cols = starts_with("postcode"),
names_to = "names",
values_to = "itemssold"
) %>%
select(-oldvarname, -names) %>%
drop_na()
df1$itemssold <- df2$itemssold
Комментарии:
1. Большое вам спасибо за ваш подход. Я имел в виду аналогичный подход, но как-то заблудился по пути! Большое вам спасибо.