【发布时间】:2014-04-19 17:11:47
【问题描述】:
我有一个因子变量,我想检索每个级别的计数。这很容易使用summary() 函数:
> h <- rnorm(100, 170, 10)
> hf <- cut(h, breaks=10)
> summary(hf)
(142,147] (147,153] (153,158] (158,163] (163,169] (169,174] (174,180] (180,185] (185,190]
5 3 7 20 11 23 12 11 6
(190,196]
2
但我希望将其包含在 knitr 报告中,因此我更喜欢一种更人性化的数据显示方式。最明显的方法是转置它,所以我得到这样的东西:
(142,147] 5
(147,153] 3
(153,158] 7
(158,163] 20
(163,169] 11
(169,174] 23
(174,180] 12
(180,185] 11
(185,190] 6
(190,196] 2
问题是:实现这一目标的最佳方法是什么?
(我所说的“最好”是指“干净、高效、紧凑且没有任何副作用”)
下面我概述了我尝试过的几种方法以及为什么我对其中任何一种都不完全满意
as.data.frame
> r <- as.data.frame(summary(hf))
> colnames(r) <- ""
> r
(142,147] 5
(147,153] 3
(153,158] 7
(158,163] 20
(163,169] 11
(169,174] 23
(174,180] 12
(180,185] 11
(185,190] 6
(190,196] 2
我不喜欢我使用临时变量来存储数据帧和一行代码只是为了抑制第二列标题(默认情况下读取summary(hf),并且不是很有帮助)。如果我可以在将摘要转换为 data.frame 时隐藏列名,或者使用一些打印函数/参数,那将是完美的。
表格
> as.data.frame(table(hf))
hf Freq
1 (142,147] 5
2 (147,153] 3
3 (153,158] 7
4 (158,163] 20
5 (163,169] 11
6 (169,174] 23
7 (174,180] 12
8 (180,185] 11
9 (185,190] 6
10 (190,196] 2
这里的标题更具可读性,但现在我有了不需要的行名。这让我想到了下一个解决方案。
write.table
> write.table(as.data.frame(table(hf)), col.names=FALSE, row.names=FALSE)
"(142,147]" 5
"(147,153]" 3
"(153,158]" 7
"(158,163]" 20
"(163,169]" 11
"(169,174]" 23
"(174,180]" 12
"(180,185]" 11
"(185,190]" 6
"(190,196]" 2
只要因子级别名称具有相同的长度,这很好。当它们的长度不同时,事情就会开始错位:
> write.table(as.data.frame(table(h>170)), col.names=FALSE, row.names=FALSE)
"FALSE" 51
"TRUE" 49
如果到目前为止有人读过,让我重复一下我的问题:
获得“转置”表中显示的每个因子水平出现次数的最佳方法是什么,可能没有任何副作用?
【问题讨论】:
-
不是答案,但
cbind(summary(hf))也很好用。看看吧。 -
@RichardScriven 和
as.matrix(summary(hf))一样。 -
setNames(as.data.frame(summary(hf)), "")可以吗? -
我认为你的 data.frame 方法是用户友好的;只需指定一个名称:
data.frame(N=summary(hf)) -
@Roland:是的,没关系。实际上,这就是使我的第一个提案“完美”所需的全部内容。我以前不知道
setNames功能。您可以将此作为答案发布,以便我接受您的答案吗?
标签: r printing transpose summary r-factor