【发布时间】:2014-10-10 07:41:56
【问题描述】:
我一直在浏览有关汇总数据的帖子,但似乎没有找到我想要的东西。
我希望创建一个汇总“计数表”,让我可以查看给患者服用某种药物的频率。一些患者同时接受多种药物的事实并不重要,因为我只想要一个所有药物的摘要,然后计算每个药物类别占所有药物的百分比。问题是,我不知道可能给予的药物的名称,它们被“隐藏”在data.frame 的某个地方,因此,我必须指定 R 必须首先查看哪些列才能创建一个“ list”,然后它可以通过它来汇总列。
我预计这指向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)))
知道我该怎么做吗?非常感谢帮助。
【问题讨论】:
-
sapply(df , function(x) 名称(table(x)) )
-
@BondedDust 我会使用
lapply而不是sapply。如果每个names(table(x))碰巧返回一个相同长度的向量,则输出将是一个数组而不是一个列表,如果您需要随后处理该对象,这可能会导致问题。 -
对。甚至可以使用
lapply(df, function(x) list( nams=unique(x), count=length(unique(x))) -
谢谢大家,但我认为这不是我问题的解决方案。这将返回每列每个字符的级别数,但不会给我整个 df 中的总和计数。例如,字母
a在 df 中出现了 16 次......这就是我想要的输出。键入summary(df),您将看到每列每个字符的汇总计数,但我想要整个df,然后还返回每个字符的总计数百分比。这就是为什么我认为ddply功能可能比lapply()更合适...感谢您的时间和帮助! -
我想我找到了解决方案,我很好奇您对我的回答有何看法
标签: r count plyr dplyr summary