在R中按级别执行计算

时间:2015-01-20 01:09:28

标签: r levels

我尝试根据数据框中的某个级别执行计算。

YEAR    MONTH   CARRIER ORIGIN  DEST    DEP_DELAY   ARR_DELAY   CANCELLED   
1   2014    1   AA  JFK LAX 14  13  0
2   2014    1   AA  JFK LAX -3  1   0   
3   2014    1   AA  JFK LAX NA  NA  1   
4   2014    1   AA  JFK LAX 65  59  0   
5   2014    1   AA  JFK LAX 110 110 0   
6   2014    1   AA  JFK LAX 17  -8  0   
7   2014    1   AA  JFK LAX 10  -13 0   

例如,我想按$CARRIER进行分组,了解每个航空公司有多少次航班延误。我还想计算其他东西,比如平均到达延迟等。 任何人都可以告诉我如何在R级别执行计算? 谢谢! 汉娜

2 个答案:

答案 0 :(得分:2)

有几种不同的方法可以做到这一点。根据您的最终目标,不同的方法提供不同的优势。

以下是三种方法的比较,使用带有虚拟数据的reproducible result

## Create data
d <- data.frame(CARRIER   = as.factor(c("a", "b",  "a", "c", "b", "a", "c")),
                DEP_DELAY = as.factor(c("Y",  "N", "N", NA, "Y", "N" ,  "Y")),
                ARR_DELAY = as.factor(c("N",  "N", "Y", "N", "Y", "N", "Y")),
                CANCELLED = as.factor(c("N",  "N", "N", "N", NA, "Y", "Y")))                

1)基础R中的aggregate函数可能是获得所需内容的最简单方法,如果您想要这样做,我建议您使用它:

aggregate(DEP_DELAY ~ CARRIER, d, summary)
    # CARRIER DEP_DELAY.N DEP_DELAY.Y
# 1       a           2           1
# 2       b           1           1 
# 3       c           0           1

2)plyr包使用与基本R不同的语法,但功能非常强大。它是由编写ggplot2绘图包的Hadley Wickham撰写的。 plyr的强大功能将是它强大的语法(当你开始做复杂的摘要时基础R会变得很笨拙)和操纵ggplot2的数据的有用性(因为Wickham写了两个并且他们互相称赞很好)。

library(plyr) # you will need to install this package
ddply(d, .(CARRIER, DEP_DELAY), summary)
#   CARRIER DEP_DELAY ARR_DELAY CANCELLED
#1    a:2       N:2       N:1       N:1  
#2    b:0       Y:0       Y:1       Y:1  
#3    c:0        <NA>      <NA>      <NA>
#4    a:1       N:0       N:1       N:1  
# I clipped the output to save space 

3)data.tables包使用第三种语法。与plyr一样,它是一个功能强大的库,它有自己的语法。它在plyr上的适应性是它可以处理更大的数据集,因为代码中的内存使用量不同。

library(data.table) # You'll also need to install this package
DT = data.table(d) # Convert data.frame to data.table
DT[,summary(DEP_DELAY), by = CARRIER]
#   CARRIER V1
#1:       a  2
#2:       a  1
#3:       b  1
#4:       b  1
#5:       c  0
#6:       c  1
#7:       c  1

如果您只是在学习R,我建议使用方法1.如果您再使用R,我建议您同时学习这两种方法,因为每个方法都可以在您的工具箱中使用。如果您使用的是较大的数据集(约100 MB或更大),我会首先学习data.table。如果你想学习ggplot2,我会首先学习`plyr'。

答案 1 :(得分:0)

您应该使用tapply()功能。

例如,假设您的data.frame名为data。然后你可以使用:

tapply(data$DEP_DELAY, data$CARRIER, function(x) length(na.omit(x)))查找每家航空公司有多少次航班延误。

tapply(data$ARR_DELAY, data$CARRIER, mean, na.rm=TRUE)找出平均到达延迟。