如何在R中返回每组nrow?

Thi*_*nis 2 r

这可能是一个非常基本的问题......我有一个简单的数据框,每个课程有不同的观察结果.我希望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))
Run Code Online (Sandbox Code Playgroud)

然后我想要有类似的东西

nrow(DF, by=course)

..返回每个课程的行数.我知道那nrow(DF, by=course)不存在,但还有什么吗?

我使用了子集,但后来我必须定义每个子集.

Ric*_*ven 7

一个简单的table将告诉你数据中每个课程有多少行.

c(table(DF$course))
# AERO CREDIT  SOLAR 
#    2      2      1 
Run Code Online (Sandbox Code Playgroud)


KFB*_*KFB 7

几乎没有提及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
Run Code Online (Sandbox Code Playgroud)

  • 虽然`as.data.table(DF)[,.N,by = course]`,但不一定要设置为DT (2认同)

Lyz*_*deR 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
Run Code Online (Sandbox Code Playgroud)

以上值得了解,但理查德的解决方案是最快的。

或者更快(使用理查德的宝贵评论):

> count(DF$course)
       x freq
1   AERO    2
2 CREDIT    2
3  SOLAR    1
Run Code Online (Sandbox Code Playgroud)