Вычислить пропорцию результата от повторных измерений дизайна - PullRequest
0 голосов
/ 29 марта 2020

У меня есть таблица в следующем формате:

CowId    Result          IMI
1        S. aureus       1
1        No growth       0
2        No growth       0
2        No growth       0
3        E. coli         1
3        No growth       0
3        E. coli         0
4        Bacillus sp.    1
4        Contaminated    0

Из этой таблицы я хотел бы рассчитать долю CowIds, которые являются отрицательными для IMI (0 = отрицательный; 1 = положительный) при все моменты времени выборки.

В этом примере 25% коров [CowId = 2] дали отрицательный результат на IMI во всех точках времени выборки.

Чтобы вычислить эту пропорцию, мой первоначальный подход заключался в том, чтобы сгруппировать каждый CowId, а затем вычислить разницу между количеством отрицательных IMI и общим количеством тестов IMI, где итоговое значение 0 будет означать, что корова была отрицательно для IMI во всех временных точках.

На данный момент мой код вычисляет это для каждого отдельного CowId. Как я могу увеличить это, чтобы вычислить пропорцию, описанную выше?

fp %>%
  filter(Result != "Contaminated") %>%
  group_by(CowId) %>%
  summarise(negative = (sum(IMI == 0) - length(IMI)))

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

С data.table

library(data.table)
setDT(fp)[Result != "Contaminated", .(negative = all(IMI == 0)), 
      .(CowId)][, .(total_percent = mean(negative)* 100 )]
#   total_percent
#1:            25

данные

fp <- structure(list(CowId = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L), 
Result = structure(c(5L, 4L, 4L, 4L, 3L, 4L, 3L, 1L, 2L), .Label = 
c("Bacillus_sp.","Contaminated", "E.coli", "No_growth", "S.aureus"), 
class = "factor"),IMI = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L)), 
class = "data.frame", row.names = c(NA, -9L))
0 голосов
/ 29 марта 2020

Мы можем подсчитать, сколько CowId получило отрицательный результат в all точках и рассчитать их соотношение.

library(dplyr)

fp %>%
  filter(Result != "Contaminated") %>%
  group_by(CowId) %>%
  summarise(negative = all(IMI == 0)) %>%
  summarise(total_percent = mean(negative) * 100)

# total_percent
#          <dbl>
#1            25

В базе R мы можем использовать aggregate

temp <- aggregate(IMI~CowId, subset(fp, Result != "Contaminated"), 
                  function(x) all(x == 0))

mean(temp$IMI) * 100

данные

fp <- structure(list(CowId = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L), 
Result = structure(c(5L, 4L, 4L, 4L, 3L, 4L, 3L, 1L, 2L), .Label = 
c("Bacillus_sp.","Contaminated", "E.coli", "No_growth", "S.aureus"), 
class = "factor"),IMI = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L)), 
class = "data.frame", row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...