我一直在浏览有关汇总数据的帖子,但似乎找不到我想要的东西。
我希望创建一个摘要" count-table"这将让我看到某种药物给患者的频率。一些患者同时接受多种药物的事实并不重要,因为我只是想要给出所有药物的总结,然后计算每种药物类别给出的所有药物的百分比。问题是,我不知道给出的可能药物的名称,他们已经隐藏了#34;在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)
返回每列的计数摘要,但不返回每个ID本身的计数,也没有所有唯一计数的百分比。
我也尝试了以下方法,这种方法朝着正确的方向发展,但理想情况下,我想要一个独特字符列表,我可以将其添加到length
参数
ddply(df, .(x), summarize, counts=length(unique(y)))
知道我怎么能这样做吗?非常感谢。
答案 0 :(得分:1)
如果您只想对整个数据帧进行计数,可以使用table(unlist(df))
(另请参阅@ goctlr的回答)&amp;如果你也想要概率: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
答案 1 :(得分:1)
有关整个数据框计数的摘要,您可以取消列出数据框,然后调用表函数:
table(unlist(df))
要获得总计数的百分比,请保存结果并使用prop.table函数:
tout <- table(unlist(df))
prop.table(tout)