Суммируйте факторную переменную по комбинациям второй факторной переменной - PullRequest
0 голосов
/ 27 июня 2018

Мои данные выглядят так

set.seed(89)
d <- data.frame(
  ID=seq(1, 100),
  Encounter=sample(c(1:50), 100, replace = TRUE), 
  EffortType=sample(c("A","B","C"), 100, replace = TRUE)
)

Я рассматриваю переменную Encounter как фактор.

Я хотел бы знать частоты возможных комбинаций EffortType.

Я бы хотел, чтобы результаты выглядели примерно так

EffortType      N
A               8
B               8
C               9
A,B             4
A,C             8
B,C             5
A,B,C           3

Я бы также хотел иметь возможность подмножества данных комбинациями EffortType. Например, я хотел бы получить подмножество EffortType A, B, которое выглядит примерно так:

ID  Encounter    EffortType    
52  2            A
53  2            B
61  2            A
63  2            A
79  2            A
36  7            B
59  7            B
83  7            A
etc.

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

d = mutate(d, 
              A = ifelse(grepl("A", EffortType), T, F),
              B = ifelse(grepl("B", EffortType), T, F),
              C = ifelse(grepl("C", EffortType), T, F))

d = data.table(d)
d[, .N, by = c('Encounter', 'A', 'B', 'C')]

Но я не заканчиваю резюме, на которое я надеюсь. Пожалуйста помоги. Thx.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я бы сделал отдельную таблицу для атрибутов столкновения:

library(data.table)
EncounterDT = d[, 
  .(tt = paste(sort(unique(EffortType)), collapse=" "))
, keyby=Encounter]

# count encounters by types
EncounterDT[, .N, keyby=tt][order(nchar(tt), tt)]

# subset d using a join
d[EncounterDT[tt == "A B", .(Encounter)], on=.(Encounter)]

Если вы предпочитаете использовать одну таблицу, хотя ...

# add a repeating-value column
d[, tt := paste(sort(unique(EffortType)), collapse=" "), by=Encounter]

# count encounters by types
d[, uniqueN(Encounter), keyby=tt][order(nchar(tt), tt)]

# subset d based using the tt column
d[tt == "A B"]
0 голосов
/ 27 июня 2018

Вот ответ на ваш первый вопрос:

> library(tidyverse)
> d %>% arrange(Encounter) %>% 
    group_by(Encounter) %>% 
    distinct(EffortType) %>% 
    arrange(EffortType) %>% 
    summarize(Efforts=paste(EffortType,collapse=",")) %>% 
    group_by(Efforts) %>% tally()
# A tibble: 7 x 2
  Efforts     n
  <chr>   <int>
1 A           6
2 A,B         7
3 A,B,C       6
4 A,C         9
5 B           6
6 B,C         5
7 C           4

Если вы сохраните вышеупомянутую обработку d как фрейм данных, называемый z, вы можете установить поднабор данных на основе каждой комбинации усилий, например, для комбинации A и B в z$Efforts[2]:

> d %>% filter(EffortType %in% unlist(strsplit(z$Efforts[2],split=",")))
   ID Encounter EffortType
1   1        43          B
2   2        15          B
3   3         8          B
4   4        36          A
5   6         2          B
6   7        50          A

Добавьте %>% arrange(EffortType) в конце, если вы хотите отсортировать по EffortType.

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