Как сгруппировать одно и то же наблюдение в кадре данных в одну группу

У меня есть данные с диагнозом по оси X (от диагноза 1 до 30) и идентификационными номерами по оси Y. Наблюдения - это другой диагноз, который пациент получил от врача.

У меня был большой массив данных, который я сделал для анализа последовательности Traminer, и получил описанный выше кадр данных. это выглядит так:

  • d1 (диагностика 1) и т. д.
  • диагноз, который я изложил ниже, является лишь примером

             d1         d2      d3        d4     d5    d6   d7 etc.
          1 cancer
          2 cancer
          3 nothing
          4 nothing
          5 cancer 
          6 headache
    

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

Пример данных:

set.seed(1) 
Data <- data.frame( d1 = sample(c("cancer", "cancer", "cancer",
 "cancer","nothing", "cancer","cancer", "cancer" )), d2 = sample(c("cancer",
 "headache", "cancer", "cancer", "nothing", "nothing", "nothing", "nothing")),
 d3 = sample(c("cancer", "headache", "cancer", "cancer", "headache", "nothing",
 "nothing", "headache")) )

Это возможно?

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

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

        D1   D2    D3 D4 D5 ECT.
 CANCER   5    4
 HEADACHE 4    3
 NOTHING  1    3

2 ответа

Один из способов - использовать конвертирование в длинный формат, считать, а затем распространять, чтобы снова перейти в широкоформатный формат. С помощью tidyverse сделать это,

library(tidyverse)

Data %>% 
 gather(var, val) %>% 
 group_by_all() %>% 
 count() %>% 
 spread(var, n)

который дает,

# A tibble: 3 x 4
  val         d1    d2    d3
  <chr>    <int> <int> <int>
1 cancer       7     3     3
2 headache    NA     1     3
3 nothing      1     4     2

Это может быть сделано более элегантно, но сделает работу для данных представлений и далее:

library(tidyverse)
df <- as.tibble(table(Data$d1)) %>% 
  rename(D1 = n) %>%
  merge(as.tibble(table(Data$d2)), by = "Var1", all = TRUE) %>%
  rename(D2 = n) %>%
  merge(as.tibble(table(Data$d3)), by = "Var1", all = TRUE) %>%
  rename(D3 = n)

Результат по вашим данным:

      Var1 D1 D2 D3
1   cancer  7  3  3
2 headache NA  1  3
3  nothing  1  4  2

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

Другие вопросы по тегам