如何在R中按组返回每组的行数?

3

这可能是一个非常基本的问题...我有一个简单的数据框,每门课程都有不同的观测值。我想让R返回每个课程的行数(在我的情况下等于观测数)。

例如:

DF <- structure(list(age = c(36, 21, 20, 32, 24), course = c("AERO", 
"AERO", "CREDIT", "CREDIT", "SOLAR")), .Names = c("age", "course"), class = "data.frame", row.names = c(NA, 
-5L))

我希望有类似这样的功能:

nrow(DF, by=course)

.. 可以返回每个课程的行数。我知道 nrow(DF, by=course) 并不存在,但还有其他的方法吗?

我已经使用了子集,但是那样就必须定义每个子集。

5个回答

9
一张简单的表格可以告诉您数据中每个课程有多少行。
c(table(DF$course))
# AERO CREDIT  SOLAR 
#    2      2      1 

8

如今在IT技术领域,data.table是一个不得不提的工具,它以速度快、内存高效和简洁的语法著称(尽管可能需要一些时间来适应)。

library(data.table)
setDT(DF)             # convert data.frame to data.table
DF[, .N, by=course]   

#    course N
# 1:   AERO 2
# 2: CREDIT 2
# 3:  SOLAR 1

2
不一定需要将其设置为DT,可以使用as.data.table(DF)[,.N, by = course] - Rich Scriven
@RichardScriven,没错。这正在成为一种习惯 :) - KFB
1
请注意,setDT通过引用(而不是复制)将数据框转换为数据表,而as.data.table(DF)则不是这样。对于大型数据集,复制可能非常昂贵。如果您想在之后使用数据框,请使用相反的函数setDF,它将通过引用将数据表对象强制转换为数据框。 - lmo

5

如果您使用plyr库进入R,还有一个值得了解的替代方案:

library(plyr)
rows_course = ddply(DF, c("course"), summarise, nrows = length(course))

> rows_course
  course nrows
1   AERO     2
2 CREDIT     2
3  SOLAR     1

上述内容值得了解,但Richard的解决方案是最快的。
甚至更快(使用Richard宝贵的评论):
> count(DF$course)
       x freq
1   AERO    2
2 CREDIT    2
3  SOLAR    1

@RichardScriven 非常感谢!我在上面提到过了。我习惯于使用ddply和summarise,以至于忘记了它。 - LyzandeR

0
使用dplyr包中的n()函数可以获取当前组的大小。
library(dplyr)
DF %>% group_by(course) %>%
  mutate(N_course = n()) %>%
  ungroup()

# A tibble: 5 x 3
    age course N_course
  <dbl> <chr>     <int>
1    36 AERO          2
2    21 AERO          2
3    20 CREDIT        2
4    32 CREDIT        2
5    24 SOLAR         1

0
一个非常简单的获取每个因子行数的方法是使用以下简单代码
n_1 = nrow(mydata[mydata$A==1,])

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