Как вы суммируете столбцы на основе уникальных идентификаторов, не зная идентификаторов в R?

Я просматривал посты об обобщении данных, но, похоже, не нашел того, что искал.

Я хочу создать сводную "таблицу подсчета", которая позволит мне увидеть, как часто пациентам давали определенное лекарство. Тот факт, что некоторые пациенты получали несколько лекарств одновременно, не имеет значения, потому что я просто хочу получить сводку всех назначенных лекарств, а затем подсчитать, какой процент в каждом классе лекарств от всех назначенных лекарств. Проблема в том, что я не знаю названий возможных лекарств, они "спрятаны" где-то в data.frameтаким образом, я должен указать, какие столбцы R должен был бы просмотреть в первую очередь, чтобы создать "список", по которому он может затем суммировать столбцы.

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

мой df выглядит примерно так

x <- sample(letters[1:4], 20, replace = TRUE)
y <- sample(letters[1:5], 20, replace = TRUE)
z <- sample(letters[1:6], 20, replace = TRUE)
df<-data.frame(x,y,z)
head(df)
  x y z
1 a a f
2 a c d
3 b b e
4 c d b
5 a a b
6 c d d

как видите, data.frame содержит три столбца, которые имеют одинаковые, но также разные буквы, с указанием названия данного лекарства.

Теперь я хотел бы создать список уникальных персонажей,

unique(x)
unique(y)
unique(z)

который служит моим списком ссылок, с помощью которого R может затем суммировать количество в каждом столбце.

summary(df)

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

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

ddply(df, .(x), summarize, counts=length(unique(y)))

Есть идеи, как я мог это сделать? Помощь высоко ценится.

2 ответа

Решение

Если вы просто хотите иметь счетчик для всего кадра данных, вы можете использовать table(unlist(df)) (см. также ответ @ goctlr) и если вы также хотите иметь вероятности: prop.table(table(unlist(df))), Когда вы также хотите получить счет для отдельных столбцов, это становится более сложным.

Чтобы получить количество для каждого столбца и общее количество, я написал следующую функцию:

# some reproducible data:
set.seed(1)
x <- sample(letters[1:4], 20, replace = TRUE)
y <- sample(letters[1:5], 20, replace = TRUE)
z <- sample(letters[1:6], 20, replace = TRUE)
df <- data.frame(x,y,z)

# the function
func <- function(x) {
  x2 <- data.frame()
  nms <- names(x)
  id <- sort(unique(unlist(x)))
  for(i in 1:length(id)) {
    for(j in 1:length(nms)) {
      x2[i,j] <- sum(x[,j] %in% id[i])
    }
  }
  names(x2) <- nms
  x2$total <- rowSums(x2)
  x2 <- cbind(id,x2)
  assign("dat", x2, envir = .GlobalEnv)
}

Выполнение функции с func(df) даст вам кадр данных dat в вашей глобальной среде:

> dat
  id x y z total
1  a 4 4 3    11
2  b 5 5 2    12
3  c 5 4 4    13
4  d 6 4 5    15
5  e 0 3 5     8
6  f 0 0 1     1

После этого вы можете рассчитать проценты, например, с помощью dplyr пакет:

library(dplyr)
dat <- dat %>% mutate(xperc=round(100*x/sum(total),1),
                      yperc=round(100*y/sum(total),1),
                      zperc=round(100*z/sum(total),1),
                      perc=round(100*total/sum(total),1))

что приводит к:

> dat
  id x y z total xperc yperc zperc perc
1  a 4 4 3    11   6.7   6.7   5.0 18.3
2  b 5 5 2    12   8.3   8.3   3.3 20.0
3  c 5 4 4    13   8.3   6.7   6.7 21.7
4  d 6 4 5    15  10.0   6.7   8.3 25.0
5  e 0 3 5     8   0.0   5.0   8.3 13.3
6  f 0 0 1     1   0.0   0.0   1.7  1.7

Для суммирования значений для всего фрейма данных вы можете удалить фрейм данных, а затем вызвать табличную функцию:

table(unlist(df))

Чтобы получить процент от общего количества, сохраните результат и используйте функцию prop.table:

tout <- table(unlist(df))
prop.table(tout)
Другие вопросы по тегам