Как сгруппировать одно и то же наблюдение в кадре данных в одну группу
У меня есть данные с диагнозом по оси 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
В какой-то момент вы, вероятно, захотите обернуть это в функцию, учитывая то же самое, что повторяется.