我尝试根据数据框中的某个级别执行计算。
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级别执行计算?
谢谢!
汉娜
答案 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)
找出平均到达延迟。