如何计算给定因子中每个级别的值的数量?

53

我有一个包含大约2500行的数据框mydf。这些行对应于第1列mydf$V1中的69个对象类别,并且我想计算每个对象类别有多少行。

我可以通过以下方式获取这些类别的因子:

objectclasses = unique(factor(mydf$V1, exclude="1"));

有什么简洁的 R 方法可以按对象类计算行数?如果使用其他语言,我会用循环遍历数组并计数,但我是 R 编程的新手,正在尝试利用 R 的向量化操作。


4
你尝试过使用“表格”吗?如果没有一个可重现的例子,很难猜测答案。 - Rich Scriven
1
可能是 https://dev59.com/vm855IYBdhLWcg3wp2N0#4215196 的重复问题。 - Henrik
9个回答

65

或者使用 dplyr 库:

library(dplyr)
set.seed(1)
dat <- data.frame(ID = sample(letters,100,rep=TRUE))
dat %>% 
  group_by(ID) %>%
  summarise(no_rows = length(ID))

请注意使用了%>%,这类似于bash中的管道符。以上代码将dat导入到group_by中,然后该操作的结果被导入到summarise中。最终结果为:
Source: local data frame [26 x 2]

   ID no_rows
1   a       2
2   b       3
3   c       3
4   d       3
5   e       2
6   f       4
7   g       6
8   h       1
9   i       6
10  j       5
11  k       6
12  l       4
13  m       7
14  n       2
15  o       2
16  p       2
17  q       5
18  r       4
19  s       5
20  t       3
21  u       8
22  v       4
23  w       5
24  x       4
25  y       3
26  z       1

请查看dplyr介绍以了解更多背景信息,并查看有关各个函数的详细文档。


这正是我想要的。表格答案也很有用;数据中存在一些问题,暂时无法使用表格,因此我暂时使用数据框。 - Escher
5
使用“表格”会更好,因为它不需要额外的库。 - Yan Foto
@YanFoto 我不明白为什么限制自己只使用基本的R更好。按照这个逻辑,您会更喜欢使用基本图形而不是ggplot2,而在我看来,ggplot2要好得多。我可以想象出一些情况,您的论点可能成立(例如,由于某种原因无法安装额外的软件包,或者被困在不支持特定软件包的旧版本的R中)。然而,作为一个笼统的陈述,我不认为基本的R解决方案比使用其他软件包的解决方案更好。 - Paul Hiemstra
1
ggplot2 实际上比 graphics 提供了额外的价值,而在这种情况下,所提供的解决方案与 table 对于因子所做的事情完全相同。我的评论涉及到手头的问题和问题,并不是关于软件包的一般性声明。 - Yan Foto
4
我同意你所说的deplyr的功能。我认为误解来自于我的陈述。我并不是要宣称其普适性!我只是在这个问题的范围内表达了一个观点。针对一个因子变量 ftable(f) 的功能与这个解决方案提出的功能相同。 - Yan Foto
显示剩余3条评论

41
这里有两种方法来实现它:
set.seed(1)
tt <- sample(letters,100,rep=TRUE)

## using table
table(tt)
tt
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
## using tapply
tapply(tt,tt,length)
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 

34

使用plyr包:

library(plyr)

count(mydf$V1)

它将返回每个值的频率。


1
这是我看到的最简单的方法,而且它真的有效。谢谢! - kabammi
不错!它返回一个列表。 - Xopi García

25

使用 data.table

 library(data.table)
 setDT(dat)[, .N, keyby=ID] #(Using @Paul Hiemstra's `dat`)

或者使用dplyr 0.3

 res <- count(dat, ID)
 head(res)
 #Source: local data frame [6 x 2]

 #  ID n
 #1  a 2
 #2  b 3
 #3  c 3
 #4  d 3
 #5  e 2
 #6  f 4

或者

  dat %>% 
      group_by(ID) %>% 
      tally()

或者

  dat %>% 
      group_by(ID) %>%
      summarise(n=n())

17

我们可以在因子列上使用summary函数:

summary(myDF$factorColumn)

summary(ggplot2::diamonds$clarity) 看起来已经按预期执行。 - woodvi
1
这应该被接受为解决方案,它通过一个内置函数完成,并且输出恰好所需的内容。 - Matěj Groman

6

另一种方法是使用n()函数,该函数计算观测值的数量。

library(dplyr)
library(magrittr)
data %>% 
  group_by(columnName) %>%
  summarise(Count = n())

3

如果我只想知道数据中有多少个唯一的因子水平,我会使用:

length(unique(df$factorcolumn))

这并不会产生每个级别的值的数量。 - Ben

1
使用plyr软件包和lapply函数获取您数据框中每个变量(因子)的每个值(级别)的频率。
library(plyr)
lapply(df, count)

这个答案可能更适合作为评论。请查看如何撰写好的答案 - https://stackoverflow.com/help/how-to-answer - Claire

0

这是一篇旧文章,但你可以使用基本的R语言而不需要数据框或数据表来完成:

sapply(levels(yTrain), function(sLevel) sum(yTrain == sLevel))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接