Как суммировать эту таблицу данных с помощью 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