Как суммировать эту таблицу данных с помощью dplyr, затем запустить chisq.test (или аналогичный) для результатов и объединить все в одну аккуратную функцию?

Этот вопрос был включен в другой вопрос, который я задал здесь, но поскольку он выходит за рамки того, что я хотел узнать в первоначальном запросе, я подумал, что он может заслуживать отдельного обсуждения.

Я пытался найти решение этой проблемы на основе ответов, которые я получил здесь и здесь, используя dplyr и функции, написанные Khashaa и Jaap.

Используя предоставленные мне решения (особенно от Jaap), я смог суммировать необработанные данные, которые я получил, в таблицу данных в виде матрицы.

dput(SO_Example_v1)
structure(list(Type = structure(c(3L, 1L, 2L), .Label = c("Community", 
"Contaminant", "Healthcare"), class = "factor"), hosp1_WoundAssocType = c(464L, 
285L, 24L), hosp1_BloodAssocType = c(73L, 40L, 26L), hosp1_UrineAssocType = c(75L, 
37L, 18L), hosp1_RespAssocType = c(137L, 77L, 2L), hosp1_CathAssocType = c(80L, 
34L, 24L), hosp2_WoundAssocType = c(171L, 115L, 17L), hosp2_BloodAssocType = c(127L, 
62L, 12L), hosp2_UrineAssocType = c(50L, 29L, 6L), hosp2_RespAssocType = c(135L, 
142L, 6L), hosp2_CathAssocType = c(95L, 24L, 12L)), .Names = c("Type", 
"hosp1_WoundAssocType", "hosp1_BloodAssocType", "hosp1_UrineAssocType", 
"hosp1_RespAssocType", "hosp1_CathAssocType", "hosp2_WoundAssocType", 
"hosp2_BloodAssocType", "hosp2_UrineAssocType", "hosp2_RespAssocType", 
"hosp2_CathAssocType"), class = "data.frame", row.names = c(NA, 
-3L))

Который выглядит следующим образом

require(dplyr)
df <- tbl_df(SO_Example_v1)
head(df)
         Type hosp1_WoundAssocType hosp1_BloodAssocType hosp1_UrineAssocType
1  Healthcare                  464                   73                   75
2   Community                  285                   40                   37
3 Contaminant                   24                   26                   18
Variables not shown: hosp1_RespAssocType (int), hosp1_CathAssocType (int), hosp2_WoundAssocType
  (int), hosp2_BloodAssocType (int), hosp2_UrineAssocType (int), hosp2_RespAssocType (int),
  hosp2_CathAssocType (int)

Колонка Type Это тип бактерий, следующие столбцы представляют, где они были выращены. Цифры представляют количество раз, когда был обнаружен соответствующий тип бактерий.

Я знаю, как должна выглядеть моя финальная таблица, но до сих пор я делал это шаг за шагом для каждого сравнения и переменной, и, несомненно, должен быть способ сделать это путем передачи нескольких функций в dplyr - но, увы, я так и не нашел ответа на этот вопрос.

Пример того, как должен выглядеть финальный стол

                                                 Wound
Type                            n Hospital 1 (%)      n Hospital 2 (%)  p-val
Healthcare associated bacteria     464 (60.0)            171 (56.4)     0.28
Community associated bacteria      285 (36.9)            115 (38.0)     0.74
Contaminants                       24 (3.1)              17 (5.6)       0.05

Где первая группирующая переменная "Wound" затем впоследствии заменяется на "Urine", "Respiratory", ..., а затем есть последний столбец под названием "All/Total", который представляет собой общее количество раз, которое каждая переменная в строках "Тип" был найден и обобщен в больницах 1 и 2, а затем сопоставлен.

То, что я сделал до сих пор, является следующим и очень утомительным, так как он рассчитывается "вручную", а затем я вручную разбиваю таблицу со всеми результатами.

### Wound cultures & healthcare associated (extracted manually)
# hosp1 464 (yes), 309 (no), 773 wound isolates in total; (% = 464 / 309 * 100)
# hosp2 171 (yes), 132 (no), 303 would isolates in total; (% = 171 / 303 * 100)

### Then the chisq.test of my contingency table
chisq.test(cbind(c(464,309),c(171,132)),correct=FALSE)

Я ценю это, если я бегу по трубопроводу dplyr на raw data.frame я не смогу получить точное форматирование желаемой таблицы, но должен быть способ хотя бы автоматизировать все шаги здесь и собрать результаты в итоговую таблицу, которую я могу экспортировать как CSV-файл, а затем просто сделать окончательное редактирование столбца и т. д.?

Любая помощь с благодарностью.

1 ответ

Решение

Это некрасиво, но это работает (Сэм в комментариях прав, что весь этот вопрос, вероятно, следует решить, настроив ваши данные в чистый формат перед анализом, но в любом случае):

Map(
  function(x,y) {
    out <- cbind(x,y)
    final <- rbind(out[1,],colSums(out[2:3,]))
    chisq.test(final,correct=FALSE)
  },
  SO_Example_v1[grepl("^hosp1",names(SO_Example_v1))],
  SO_Example_v1[grepl("^hosp2",names(SO_Example_v1))] 
)

#$hosp1_WoundAssocType
#
#        Pearson's Chi-squared test
#
#data:  final
#X-squared = 1.16, df = 1, p-value = 0.2815
# etc etc...

Соответствует вашему намеченному результату:

chisq.test(cbind(c(464,309),c(171,132)),correct=FALSE)
#
#        Pearson's Chi-squared test
# 
#data:  cbind(c(464, 309), c(171, 132))
#X-squared = 1.16, df = 1, p-value = 0.2815
Другие вопросы по тегам