Как вы суммируете столбцы на основе уникальных идентификаторов, не зная идентификаторов в 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)