如何获取列中特定值的行数

时间:2013-06-18 19:28:19

标签: r

我正在尝试获取特定列的行数。我有三列名称,年龄和专业。我怎样才能从这个列表中找出有多少BIO专业。

我有DF< - (NAME,YEAR,MAJOR,GPA) 我希望有一个功能,所以我可以消除少于20人的任何专业。

所以我想要这样的东西,但在实际的r代码中。

DF <- function(x){
##  Y <- get number of people for each major
##  GPA [DF$Y < 20] <- NA

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:11)

我认为到目前为止提供的两种方法过于复杂。尝试其中任何一个,其中第二个显然是“正确的方式”。 :-)(借用@ gung的例子。)

#  1
> tapply( DF$MAJOR, DF$MAJOR, length)
 BIO ECON HIST  LIT MATH 
 181  155  297  303   64 

#  2
> table(DF$MAJOR)

 BIO ECON HIST  LIT

 MATH 
     181  155  297  303   64 

And as far as efficiency?

> system.time( {dt = data.table(DF)
+  foo <- dt[,.N,by=MAJOR] })
   user  system elapsed 
  1.384   0.027   1.417 
> system.time(foo<- table(DF$MAJOR) )
   user  system elapsed 
  0.110   0.025   0.134 
#edit:
> system.time( {dt = as.data.table(DF)
+  foo <- dt[,.N,by=MAJOR] })
   user  system elapsed 
  0.064   0.022   0.086 

关于如何将表格结果与每个学生记录相关联的评论中的附加问题的答案,查看ave函数并将第一个方法与“[” - 提示或{{1}一起使用}:

subset

答案 1 :(得分:2)

计算你有多少东西的基本方法是总结一个逻辑向量,如果原始元素是你要计算的东西,逻辑向量的每个元素都是1,否则为0 。

让我们从一些数据开始:

N = 1000
set.seed(2)
DF <- data.frame(NAME=as.character(1:N), 
                 YEAR=sample(c("Freshman","Sophomore","Junior","Senior"),
                             size=N, replace=T), 
                 MAJOR=sample(c("BIO","ECON","HIST","LIT","MATH"),size=N, 
                              replace=T, prob=c(.20, .15, .30, .30, .05)), 
                 GPA=runif(N, min=0, max=4))

因此,我们会找出您拥有多少BIO个专业:

sum(DF$MAJOR=="BIO")
[1] 181

如果您想知道您拥有的每个专业的数量,您可以获得?unique的专业列表,然后使用?lapply将上述函数应用于列表:< / p>

lapply(unique(DF$MAJOR), function(x){ sum(DF$MAJOR==x) })

这是一个稍微漂亮的版本:

cbind(levels(unique(DF$MAJOR)), 
      lapply(unique(DF$MAJOR), function(x){ sum(DF$MAJOR==x) }))
     [,1]   [,2]
[1,] "BIO"  297 
[2,] "ECON" 303 
[3,] "HIST" 181 
[4,] "LIT"  155 
[5,] "MATH" 64  

你应该可以从这里拿走它。


更新: @DWin是对的,我让这太复杂了。由于DF$MAJOR是一个因素,您只需执行以下操作:

> summary(DF$MAJOR)
 BIO ECON HIST  LIT MATH 
 181  155  297  303   64 

答案 2 :(得分:2)

同样,这是救援的data.table包分组功能。有一个'.N'表示法,表示每个组中的行数,它可以为您提供所需的内容。借用上一个答案:

> N = 1000
> set.seed(2)
> dt <- data.table(NAME=as.character(1:N), 
+                  YEAR=sample(c("Freshman","Sophomore","Junior","Senior"),
+                              size=N, replace=T), 
+                  MAJOR=sample(c("BIO","ECON","HIST","LIT","MATH"),size=N, 
+                               replace=T, prob=c(.20, .15, .30, .30, .05)), 
+                  GPA=runif(N, min=0, max=4))
> dt[,.N,by=MAJOR]
   MAJOR   N
1:  HIST 297
2:   LIT 303
3:   BIO 181
4:  ECON 155
5:  MATH  64

所以它现在是一个单行。它也很快(使用N = 1000000):

> system.time( foo <- cbind(levels(unique(DF$MAJOR)), 
+       lapply(unique(DF$MAJOR), function(x){ sum(DF$MAJOR==x) })) )
     user    system   elapsed 
    0.616     0.050     0.665 
> dt = data.table(DF)
> system.time( foo <- dt[,.N,by=MAJOR] )
     user    system   elapsed 
    0.039     0.002     0.042