R: несколько переменных, определенных в столбце?

#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. Большое вам спасибо за ваш подход. Я имел в виду аналогичный подход, но как-то заблудился по пути! Большое вам спасибо.