如何计算给定因子中每个级别有多少个值?
Posted
技术标签:
【中文标题】如何计算给定因子中每个级别有多少个值?【英文标题】:How to count how many values per level in a given factor? 【发布时间】:2014-11-24 17:01:25 【问题描述】:我有一个大约 2500 行的 data.frame mydf
。这些行对应于列 1 mydf$V1
中的 69 类对象,我想计算每个对象类有多少行。
我可以通过以下方式获得这些类的一个因素:
objectclasses = unique(factor(mydf$V1, exclude="1"));
计算每个对象类的行数的简洁 R 方法是什么?如果这是任何其他语言,我会使用循环遍历数组并保持计数,但我是 R 编程新手,正在尝试利用 R 的向量化操作。
【问题讨论】:
你试过table
吗?没有可重现的例子,很难猜出答案
***.com/questions/4215154/count-unique-values-in-r/…的可能重复
【参考方案1】:
这里有两种方法:
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
【讨论】:
【参考方案2】:或使用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
introduction 了解更多上下文,以及有关各个功能的详细信息的文档。
【讨论】:
这正是我想要的。表格答案也很有用;数据存在一些问题,导致我暂时无法使用表格,因此我目前正在使用 data.frame。 我是 R 新手,但似乎这个 dplyr 包是 R 的 jquery。它是很多事情的答案。 使用table
会更好,因为它不需要额外的库。
ggplot2
实际上比graphics
提供了一个附加值,而在这种情况下,所提供的解决方案与table
的作用完全相同。我的评论指的是问题和手头的问题,不是关于包的一般性陈述。
关于deplyr
可以做什么,我和你意见一致。我认为误解来自我的陈述。我不赞成普遍性!我的意思是,在这个问题的范围内,这种观点是有限的。给定因子f
,table(f)
的作用与此解决方案建议的相同。【参考方案3】:
使用plyr
包:
library(plyr)
count(mydf$V1)
它将返回每个值的频率。
【讨论】:
这是我在这里能看到的最简单的方法,而且很有效。谢谢!【参考方案4】:使用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())
【讨论】:
【参考方案5】:我们可以在因子列上使用summary
:
summary(myDF$factorColumn)
【讨论】:
summary(ggplot2::diamonds$clarity)
看起来像是按预期执行的。
这应该被接受为一种解决方案,它通过一个内置函数完成并准确输出所需内容。【参考方案6】:
使用包 plyr 和 lapply 来获取数据框中每个值(级别)和每个变量(因子)的频率。
library(plyr)
lapply(df, count)
【讨论】:
这个答案可能属于评论。请查看如何写一个好的答案 - ***.com/help/how-to-answer【参考方案7】:另一种方法是应用 n() 函数来计算观察次数
library(dplyr)
library(magrittr)
data %>%
group_by(columnName) %>%
summarise(Count = n())
【讨论】:
【参考方案8】:如果我只想知道数据中存在多少个独特的因子水平,我会使用:
length(unique(df$factorcolumn))
【讨论】:
【参考方案9】:这是一篇旧文章,但您可以使用基本 R 并且没有数据框/数据表来做到这一点:
sapply(levels(yTrain), function(sLevel) sum(yTrain == sLevel))
【讨论】:
以上是关于如何计算给定因子中每个级别有多少个值?的主要内容,如果未能解决你的问题,请参考以下文章