如何按值对_进行分组,并使用R获取数据帧中多个属性的计数

如何按值对_进行分组,并使用R获取数据帧中多个属性的计数,r,dataframe,dplyr,summarization,R,Dataframe,Dplyr,Summarization,我有一个以下格式的数据框。我正在生成样本数据,但我有数千条类似格式的记录: ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY JFK MCO 1 0 47 JFK LAX JFK MCO 1 2

我有一个以下格式的数据框。我正在生成样本数据,但我有数千条类似格式的记录:

  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\u之后使用
summary\u每个
。不过,您必须重命名这些列

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

您可以使用
dplyr
软件包在
group\u之后使用
summary\u。不过,您必须重命名这些列

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

注意:这种简单的方法还提供了正确的输出,正如公认的那样。

我们可以使用
数据。表

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))
返回

  ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
1    LOG  DFW             1             1         1
2    JFK  MCO             2             1         2

我使用
cbind
将汇总变量组合在一起,并为输出命名。

使用基本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))
返回

  ORIGIN DEST CARRIER_DELAY WEATHER_DELAY NAS_DELAY
1    LOG  DFW             1             1         1
2    JFK  MCO             2             1         2

我使用
cbind
将摘要变量组合在一起,并为输出命名。

工作起来很有魅力。非常感谢。工作很有魅力。谢谢。