Подсчитать строки и исключить строку при следующем подсчете - PullRequest
0 голосов
/ 24 сентября 2019

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

Обратите внимание, что образец набора данныхвзята из выборки из большего набора данных, который имеет неравные n() значения при обработке.Кроме того, отдельные лица могут появляться в переписи, но не в следующей.

Образец набора данных

sampledata <- data.frame(treatment = c("A", "A", "H", "H", "H", "A", "A", "H", "H", "H",
                                       "A", "A", "H", "H", "H", "A", "A", "H", "H", "H"), 
                         individual = c("1", "2", "3", "4", "5", "1", "2", "3", "4", "5",
                                        "1", "2", "3", "4", "5", "1", "2", "3", "4", "5"),
                         census = c("1", "1", "1", "1", "1", "2", "2", "2", "2", "2", 
                                    "3", "3", "3", "3", "3", "4", "4", "4", "4", "4"),
                         value = c("0", "0", "1", "0", "0", "0", "0", "4", "3", "0",
                                   "0", "0", "8", "5", "2", "0", "1", "15", "7", "4"))

Это мой код, который я пытался использовать

  • totalобщее количество лиц treatment и census.
  • count - это число лиц с value>0 для этого treatment и census.
  • cum.sum - это кумулятивное число людей с value>0 для этого treatment и начиная с переписи 1

Если бы мне удалось получить только уникальных лиц (не учитываемых в предыдущей переписи), тогда cum.sum никогда не должно быть больше n.

К сожалению, как вы можете видеть, на выходе выдается кумулятивное число, превышающее фактический размер выборки n.

library(dplyr)
sampledata$value <- as.numeric(sampledata$value)
sampledata2 <- sampledata %>%
  group_by(treatment, census) %>%
  summarise(count=sum(value>0), total=n()) %>%
  ungroup() %>%
  group_by(treatment) %>%
  mutate(cum.sum=cumsum(count))

Ожидаемый результат

          treatment census count total cum.sum
1         A         1      0     2       0
2         A         2      0     2       0
3         A         3      0     2       0
4         A         4      1     2       1
5         H         1      1     3       1
6         H         2      1     3       2
7         H         3      1     3       3
8         H         4      0     3       3

РЕДАКТИРОВАНИЕ / ОБЪЯСНЕНИЕ ДЛЯ ОЖИДАЕМОГО ВЫХОДА

Для treatment=H, census=4, переменная count=0.Причина, по которой он равен 4, состоит в том, что у 3 человек значение выше 0 во время переписи уже было обнаружено.Я думаю, что именование переменной count, как она есть, могло сбить с толку читателей.

Предполагается, что переменная count ОБНАРУЖИТ строки в census (treatment), которые имеют value>0 и НЕ ОБНАРУЖЕНЫ ДО ПЕРЕД.

1 Ответ

0 голосов
/ 25 сентября 2019

Вы можете просто вычислить дополнительную переменную, чтобы настроить способ определения count.

Добавление never_detected_before в ваш код:

library(dplyr)

sampledata2 <- sampledata %>%
  mutate(value = as.numeric(as.character(value))) %>% 

  group_by(treatment, individual) %>% 
  arrange(treatment, individual, census) %>% 
  mutate(never_detected_before = cumsum(value>0) <= 1) %>% 

  group_by(treatment, census) %>%
  summarise(count=sum(value>0 & never_detected_before), total=n()) %>%
  group_by(treatment) %>%
  mutate(cum.sum=cumsum(count))

Также обратите внимание, что group_by() по умолчаниюпереопределяет существующие группы, поэтому ungroup() не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...