我有一个包含大约2500行的数据框mydf
。这些行对应于第1列mydf$V1
中的69个对象类别,并且我想计算每个对象类别有多少行。
我可以通过以下方式获取这些类别的因子:
objectclasses = unique(factor(mydf$V1, exclude="1"));
有什么简洁的 R 方法可以按对象类计算行数?如果使用其他语言,我会用循环遍历数组并计数,但我是 R 编程的新手,正在尝试利用 R 的向量化操作。
我有一个包含大约2500行的数据框mydf
。这些行对应于第1列mydf$V1
中的69个对象类别,并且我想计算每个对象类别有多少行。
我可以通过以下方式获取这些类别的因子:
objectclasses = unique(factor(mydf$V1, exclude="1"));
有什么简洁的 R 方法可以按对象类计算行数?如果使用其他语言,我会用循环遍历数组并计数,但我是 R 编程的新手,正在尝试利用 R 的向量化操作。
或者使用 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
介绍以了解更多背景信息,并查看有关各个函数的详细文档。
ggplot2
实际上比 graphics
提供了额外的价值,而在这种情况下,所提供的解决方案与 table
对于因子所做的事情完全相同。我的评论涉及到手头的问题和问题,并不是关于软件包的一般性声明。 - Yan Fotodeplyr
的功能。我认为误解来自于我的陈述。我并不是要宣称其普适性!我只是在这个问题的范围内表达了一个观点。针对一个因子变量 f
,table(f)
的功能与这个解决方案提出的功能相同。 - Yan Fotoset.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
使用plyr
包:
library(plyr)
count(mydf$V1)
它将返回每个值的频率。
使用 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())
我们可以在因子列上使用summary
函数:
summary(myDF$factorColumn)
summary(ggplot2::diamonds$clarity)
看起来已经按预期执行。 - woodvi另一种方法是使用n()函数,该函数计算观测值的数量。
library(dplyr)
library(magrittr)
data %>%
group_by(columnName) %>%
summarise(Count = n())
如果我只想知道数据中有多少个唯一的因子水平,我会使用:
length(unique(df$factorcolumn))
library(plyr)
lapply(df, count)
这是一篇旧文章,但你可以使用基本的R语言而不需要数据框或数据表来完成:
sapply(levels(yTrain), function(sLevel) sum(yTrain == sLevel))