如何使用 R group_by 值并获取数据框中多个属性的计数
How to group_by values and get the count for multiple attributes in dataframe using R
我有以下格式的数据框。我正在生成示例数据,但我有数千条类似格式的记录:
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
JFK MCO 1 0 47
JFK LAX
JFK MCO 1 2 30
LOG DFW 12 20 3
LOG DFW
我需要按出发地和目的地分组,并使用 dplyr 函数计算每个延迟的发生次数(计数)。延迟列中的值以分钟为单位。我需要考虑大于 0 的值并将这些值的计数增加 1。某些行存在空值,我也需要忽略它们。
输出应如下所示:
ORIGIN DEST CARR_DELAY_COUNT WEATHER_DELAY_COUNT NAS_DELAY_COUNT
JFK MCO 2 1 2
LOG DFW 1 1 1
我正在使用以下 dplyr 函数:
flight.df %>%
group_by(ORIGIN,DEST) %>%
summarize(carr_delay=sum(CARRIER_DELAY,na.rm=TRUE),
weather_delay=sum(WEATHER_DELAY,na.rm=TRUE),
nas_delay=sum(NAS_DELAY,na.rm=TRUE) %>%
group_by() %>%
{.} -> delays.df
上述函数将生成按特定源和目标的每个延迟类别分组的延迟值总和。
在这里我需要如何插入另一个函数来计算每个延迟的计数而不是总和?
您可以在使用 dplyr
包的 group_by
之后使用 summarize_each
。不过,您必须重命名这些列。
library(dplyr)
df %>% group_by(ORIGIN, DEST) %>% summarize_each(funs(Count = sum(.>0, na.rm=T)))
Source: local data frame [3 x 5]
Groups: ORIGIN [?]
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
(fctr) (fctr) (int) (int) (int)
1 JFK LAX 0 0 0
2 JFK MCO 2 1 2
3 LOG DFW 1 1 1
我们可以使用data.table
library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x > 0, na.rm=TRUE)) , .(ORIGIN, DEST)]
# ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
#1: JFK MCO 2 1 2
#2: JFK LAX 0 0 0
#3: LOG DFW 1 1 1
注意:这种简单的方法也提供正确的输出作为公认的输出。
使用基本 R 函数计算也很简单,aggregate
。
aggregate(cbind("CARRIER_DELAY"=CARRIER_DELAY,
"WEATHER_DELAY"=WEATHER_DELAY,
"NAS_DELAY"=NAS_DELAY) ~ ORIGIN + DEST,
data=df, FUN=function(x) sum(x > 0, na.rm=TRUE))
哪个returns
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
1 LOG DFW 1 1 1
2 JFK MCO 2 1 2
我使用 cbind
将汇总变量组合在一起并为输出命名。
我有以下格式的数据框。我正在生成示例数据,但我有数千条类似格式的记录:
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
JFK MCO 1 0 47
JFK LAX
JFK MCO 1 2 30
LOG DFW 12 20 3
LOG DFW
我需要按出发地和目的地分组,并使用 dplyr 函数计算每个延迟的发生次数(计数)。延迟列中的值以分钟为单位。我需要考虑大于 0 的值并将这些值的计数增加 1。某些行存在空值,我也需要忽略它们。
输出应如下所示:
ORIGIN DEST CARR_DELAY_COUNT WEATHER_DELAY_COUNT NAS_DELAY_COUNT
JFK MCO 2 1 2
LOG DFW 1 1 1
我正在使用以下 dplyr 函数:
flight.df %>%
group_by(ORIGIN,DEST) %>%
summarize(carr_delay=sum(CARRIER_DELAY,na.rm=TRUE),
weather_delay=sum(WEATHER_DELAY,na.rm=TRUE),
nas_delay=sum(NAS_DELAY,na.rm=TRUE) %>%
group_by() %>%
{.} -> delays.df
上述函数将生成按特定源和目标的每个延迟类别分组的延迟值总和。
在这里我需要如何插入另一个函数来计算每个延迟的计数而不是总和?
您可以在使用 dplyr
包的 group_by
之后使用 summarize_each
。不过,您必须重命名这些列。
library(dplyr)
df %>% group_by(ORIGIN, DEST) %>% summarize_each(funs(Count = sum(.>0, na.rm=T)))
Source: local data frame [3 x 5]
Groups: ORIGIN [?]
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
(fctr) (fctr) (int) (int) (int)
1 JFK LAX 0 0 0
2 JFK MCO 2 1 2
3 LOG DFW 1 1 1
我们可以使用data.table
library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x > 0, na.rm=TRUE)) , .(ORIGIN, DEST)]
# ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
#1: JFK MCO 2 1 2
#2: JFK LAX 0 0 0
#3: LOG DFW 1 1 1
注意:这种简单的方法也提供正确的输出作为公认的输出。
使用基本 R 函数计算也很简单,aggregate
。
aggregate(cbind("CARRIER_DELAY"=CARRIER_DELAY,
"WEATHER_DELAY"=WEATHER_DELAY,
"NAS_DELAY"=NAS_DELAY) ~ ORIGIN + DEST,
data=df, FUN=function(x) sum(x > 0, na.rm=TRUE))
哪个returns
ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
1 LOG DFW 1 1 1
2 JFK MCO 2 1 2
我使用 cbind
将汇总变量组合在一起并为输出命名。