Ошибка «Атрибут не идентичен» при использовании функции сбора для нескольких столбцов в R

#r #dataframe #dplyr #tidyverse #tidy

#r #фрейм данных #dplyr #tidyverse #приведение в порядок

Вопрос:

Я использую следующий фрейм данных.

 df2<-final.data%>% gather(Hospital,Attendance,contains("Attendance"))
df2 %>% spread(Hospital, Attendance)
    > dput(final.data[0:2,])
    structure(list(RoyalPerth.Attendance = c(235, 209), RoyalPerth.Admissions = c(99, 
97), RoyalPerth.Tri1 = c("8", "N/A"), RoyalPerth.Tri2 = c(33, 
41), RoyalPerth.Tri3 = c(89, 73), RoyalPerth.Tri4 = c(85, 80), 
    RoyalPert

h.Tri5 = c("20", "14"), Fremantle.Attendance = c(155, 
    145), Fremantle.Admissions = c(70, 56), Fremantle.Tri1 = c("N/A", 
    "N/A"), Fremantle.Tri2 = c(25, 22), Fremantle.Tri3 = c(67, 
    51), Fremantle.Tri4 = c(54, 47), Fremantle.Tri5 = c(9, 24
    ), PrincessMargaret.Attendance = c(252, 219), PrincessMargaret.Admissions = c(59, 
    47), PrincessMargaret.Tri1 = c("N/A", "N/A"), PrincessMargaret.Tri2 = c("13", 
    "14"), PrincessMargaret.Tri3 = c(75, 61), PrincessMargaret.Tri4 = c(159, 
    139), PrincessMargaret.Tri5 = c("4", "4"), KingEdward.Attendance = c(52, 
    43), KingEdward.Admissions = c("6", "7"), KingEdward.Tri1 = c("N/A", 
    "N/A"), KingEdward.Tri2 = c("N/A", "N/A"), KingEdward.Tri3 = c("7", 
    "N/A"), KingEdward.Tri4 = c(20, 25), KingEdward.Tri5 = c("25", 
    "17"), SirCharles.Attendance = c(209, 184), SirCharles.Admissions = c(109, 
    112), SirCharles.Tri1 = c("N/A", "N/A"), SirCharles.Tri2 = c(42, 
    43), SirCharles.Tri3 = c(108, 73), SirCharles.Tri4 = c(47, 
    61), SirCharles.Tri5 = c("11", "5"), Armadale.Attendance = c(166, 
    175), Armadale.Admissions = c(19, 25), Armadale.Tri1 = c("N/A", 
    "N/A"), Armadale.Tri2 = c(16, 26), Armadale.Tri3 = c(62, 
    73), Armadale.Tri4 = c(79, 55), Armadale.Tri5 = c("9", "19"
    ), Swan.Attendance = c(133, 129), Swan.Admissions = c(17, 
    25), Swan.Tri1 = c("N/A", "N/A"), Swan.Tri2 = c(29, 25), 
    Swan.Tri3 = c(59, 57), Swan.Tri4 = c(42, 43), Swan.Tri5 = c("N/A", 
    "4"), Rockingham.Attendance = c(155, 145), Rockingham.Admissions = c("10", 
    "24"), Rockingham.Tri1 = c("N/A", "N/A"), Rockingham.Tri2 = c(12, 
    26), Rockingham.Tri3 = c(51, 45), Rockingham.Tri4 = c(81, 
    65), Rockingham.Tri5 = c("11", "8"), Joondalup.Attendance = c(267, 
    241), Joondalup.Admissions = c(73, 81), Joondalup.Tri1 = c("N/A", 
    "N/A"), Joondalup.Tri2 = c(27, 23), Joondalup.Tri3 = c(75, 
    78), Joondalup.Tri4 = c(151, 133), Joondalup.Tri5 = c("12", 
    "7")), row.names = 1:2, class = "data.frame")
  

Ошибка:

Предупреждающее сообщение: атрибуты не идентичны для переменных измерения; они будут удалены

Я пробовал следующие вещи: hospital.dataset<-gather(больница, сортировка, сумма, Tri1: Tri5) для сбора сортировки после использования cbind в наборе данных.

Я хочу скрыть его в длинный набор данных с помощью gather.

  dput(hospital.dataset[1:2,])
structure(list(Date = structure(c(-714598, -714597), class = "Date"), [enter image description here][1]
    Attendance = c(235, 209), Admissions = c(99, 97), Hospital = structure(c(1L, 
    1L), .Label = c("RoyalPerth Hospital", "Fremantle Hospital", 
    "Princess Margaret Hospital", "KingEdward Hospital", "SirCharles Hospital", 
    "Armadale Hospital", "Swan Hospital", "Rockingham Hospital", 
    "Joondalup Hospital"), class = "factor"), triage = c("Tri1", 
    "Tri1"), sum = c(8, 0)), row.names = 1:2, class = "data.frame")
  

Вот так.

Заранее спасибо.

Ожидаемый фрейм данных

Комментарии:

1. Ваши dput входные данные повреждены. Это показывает malformed factor . Не могли бы вы обновить. Спасибо

2. @akrun Я обновил. Спасибо

3. Однако это приводит к ошибкам

Ответ №1:

Примечание: Это решение требует больших усилий. Поэтому, пожалуйста, подумайте, могут ли быть доступны более элегантные подходы.

Одна из проблем с этими данными заключается в том, что значения, которые вы хотите «wide» ( Attendance , Admissions ), смешиваются со значениями, которые вы хотите «long» ( Tri1 , Tri2 и т.д.).

Это решение использует pivot_longer для всего фрейма данных (примечание: pivot_longer это новый gather синтаксис), а затем separate для извлечения названия больницы из конкретного поля данных.

Затем он разбивается на два фрейма данных, применяется pivot_wider к Attendance / Admissions столбцам и после этого воссоединяется.

 library(tidyverse)

final_data_long <- final.data.raw %>% 
  mutate_all(as.character) %>%
  mutate(row_n = row_number()) %>%
  pivot_longer(-row_n, names_to = "field", values_to = "value") %>%
  separate(field, into = c("hospital", "category")) 

attend_admit <- final_data_long %>%
  filter(str_detect(category, "Attendance|Admissions"))

triage <- final_data_long %>% anti_join(attend_admit)

attend_admit_long <- 
  attend_admit %>%
  group_by(row_n) %>%
  pivot_wider(id_cols = c(row_n, hospital), names_from = category, 
              values_from = value)

triage %>% 
  inner_join(attend_admit_long, by = c("row_n", "hospital")) %>%
  arrange(hospital) %>%
  select(-row_n)
  

Вывод

 # A tibble: 90 x 5
   hospital category value Attendance Admissions
   <chr>    <chr>    <chr> <chr>      <chr>     
 1 Armadale Tri1     N/A   166        19        
 2 Armadale Tri2     16    166        19        
 3 Armadale Tri3     62    166        19        
 4 Armadale Tri4     79    166        19        
 5 Armadale Tri5     9     166        19        
 6 Armadale Tri1     N/A   175        25        
 7 Armadale Tri2     26    175        25        
 8 Armadale Tri3     73    175        25        
 9 Armadale Tri4     55    175        25        
10 Armadale Tri5     19    175        25        
# … with 80 more rows
  

Данные
* Я не смог заставить OP dput работать, вот версия, которую можно скопировать / вставить:

 final.data.raw <- structure(
  list(RoyalPerth.Attendance = c(235, 209), RoyalPerth.Admissions = c(99, 97), RoyalPerth.Tri1 = c("8", "N/A"), 
       RoyalPerth.Tri2 = c(33, 41), RoyalPerth.Tri3 = c(89, 73), RoyalPerth.Tri4 = c(85, 80), 
       RoyalPerth.Tri5 = c("20", "14"), Fremantle.Attendance = c(155, 145), Fremantle.Admissions = c(70, 56), 
       Fremantle.Tri1 = c("N/A", "N/A"), Fremantle.Tri2 = c(25, 22), Fremantle.Tri3 = c(67, 51), 
       Fremantle.Tri4 = c(54, 47), Fremantle.Tri5 = c(9, 24), PrincessMargaret.Attendance = c(252, 219), 
       PrincessMargaret.Admissions = c(59,47), PrincessMargaret.Tri1 = c("N/A", "N/A"), PrincessMargaret.Tri2 = c("13", "14"), 
       PrincessMargaret.Tri3 = c(75, 61), PrincessMargaret.Tri4 = c(159, 139), PrincessMargaret.Tri5 = c("4", "4"), 
       KingEdward.Attendance = c(52, 43), KingEdward.Admissions = c("6", "7"), KingEdward.Tri1 = c("N/A", "N/A"), 
       KingEdward.Tri2 = c("N/A", "N/A"), KingEdward.Tri3 = c("7", "N/A"), KingEdward.Tri4 = c(20, 25), 
       KingEdward.Tri5 = c("25", "17"), SirCharles.Attendance = c(209, 184), SirCharles.Admissions = c(109, 112), 
       SirCharles.Tri1 = c("N/A", "N/A"), SirCharles.Tri2 = c(42, 43), SirCharles.Tri3 = c(108, 73), 
       SirCharles.Tri4 = c(47, 61), SirCharles.Tri5 = c("11", "5"), Armadale.Attendance = c(166, 175), 
       Armadale.Admissions = c(19, 25), Armadale.Tri1 = c("N/A", "N/A"), Armadale.Tri2 = c(16, 26), 
       Armadale.Tri3 = c(62, 73), Armadale.Tri4 = c(79, 55), Armadale.Tri5 = c("9", "19"), 
       Swan.Attendance = c(133, 129), Swan.Admissions = c(17, 25), Swan.Tri1 = c("N/A", "N/A"), 
       Swan.Tri2 = c(29, 25), Swan.Tri3 = c(59, 57), Swan.Tri4 = c(42, 43), 
       Swan.Tri5 = c("N/A", "4"), Rockingham.Attendance = c(155, 145), Rockingham.Admissions = c("10", "24"), 
       Rockingham.Tri1 = c("N/A", "N/A"), Rockingham.Tri2 = c(12, 26), Rockingham.Tri3 = c(51, 45), 
       Rockingham.Tri4 = c(81, 65), Rockingham.Tri5 = c("11", "8"), Joondalup.Attendance = c(267, 241), 
       Joondalup.Admissions = c(73, 81), Joondalup.Tri1 = c("N/A", "N/A"), Joondalup.Tri2 = c(27, 23), 
       Joondalup.Tri3 = c(75, 78), Joondalup.Tri4 = c(151, 133), Joondalup.Tri5 = c("12", "7")), 
  row.names = 1:2, class = "data.frame")
  

Комментарии:

1. Спасибо, это работает для меня. Большое спасибо за разработку.