Как распределить строки по столбцам путем группировки и фильтрации?

#r #dataframe #data-science #data-analysis #transpose

#r #dplyr

Вопрос:

У меня есть набор данных, примерно такой:

 df_1 <- tribble(
  ~id,       ~type,     ~min_price,  ~max_price,
  "1",        "X",          10,          40,
  "1",        "Y",          20,          50,
  "2",        "X",          18,          40,
  "2",        "Y",          34,          50,
  "2",         NA,          15,          70,
  "3",        "X",          40,          90,
  "3",        "Y",          23,         100,
)
  

Но теперь я хочу сгруппировать данные по «id», а затем переключить строки на столбцы. Я думаю, что это не что-то вроде транспонирования.

 df_1 <- tribble(
  ~id,      ~min_price_X, ~min_price_Y,  ~min_price_NA,  ~max_price_X, ~max_price_Y,  ~max_price_NA,
  "1",           10,           10,             NA,             40,           50,            NA,      
  "2",           18,           34,             15,             40,           50,            70,
  "3",           40,           23,             NA,             90,          100,            NA, 
)
  

Есть ли у вас какие-либо предложения по получению этих данных?

Ответ №1:

Мы можем использовать, pivot_wider который может занимать несколько values столбцов.

 tidyr::pivot_wider(df_1, names_from = type, values_from = c(min_price, max_price))

# A tibble: 3 x 7
#  id    min_price_X min_price_Y min_price_NA max_price_X max_price_Y max_price_NA
#  <chr>       <dbl>       <dbl>        <dbl>       <dbl>       <dbl>        <dbl>
#1 1              10          20           NA          40          50           NA
#2 2              18          34           15          40          50           70
#3 3              40          23           NA          90         100           NA
  

Ответ №2:

Вы можете попробовать это:

 library("reshape2")
dcast(melt(df_1, id.vars = c("id", "type")), id ~ variable   type)
  

Результатом будет:

   id min_price_X min_price_Y min_price_NA max_price_X max_price_Y max_price_NA
1  1          10          20           NA          40          50           NA
2  2          18          34           15          40          50           70
3  3          40          23           NA          90         100           NA