使用Countifs&的等价物。查找总结R中的数据

时间:2015-06-22 16:16:48

标签: r excel dataframe countif

我有一个交易数据文件(位置之间的旅行),我希望用R总结,我相对较新。 样本数据

    Start.Date          Start.Area         End.Date            End.Area
    2007-07-12 14:00    New Street         2007-07-12 15:46    Windy Lane
    2007-07-12 15:10    High Street        2007-07-12 18:08    New Street
    2007-07-12 16:42    Kings Street       2007-07-12 17:47    Windy Lane

我的目标是返回某个区域每天(可能是小时)的出现次数。

新数据框中的样本返回

    Date                Area               Start.Occurances   End.Occurances           
    2007-07-12          New Street         1                  1
    2007-07-12          High Street        1                  0
    2007-07-12          Kings Street       1                  0
    2007-07-12          Windy Lane         0                  2

理想情况下,我会在Excel中进行分析,但它无法处理我的数据规模。在电子表格中,我将使用countif函数来查看该区域在给定日期/时间内出现的次数。

如果可能的话,我也希望将Start.Occurances和End.Occurances都归零。

我已经看到的有关Countif功能或匹配/索引组合的问题尚未解决我的问题,所以我希望有人可以帮助我!

1 个答案:

答案 0 :(得分:1)

这可以通过首先重塑然后总结来完成。以下是使用reshape2dplyr的示例(数据为dat)。

## First reshape the data
library(reshape2)
m <- melt(dat, id.vars=c("Start.Date", "End.Date"), 
          value.name = "Area", variable.name="Area.Pos")

## Summarise, grouping by Area
library(dplyr)
m %>% group_by(Area) %>% 
  summarise(Start.Occurences = sum(Area.Pos == "Start.Area"),
            End.Occurences = sum(Area.Pos == "End.Area"))
#            Area Start.Occurences End.Occurences
# 1   High Street                1              0
# 2  Kings Street                1              0
# 3    New Street                1              1
# 4    Windy Lane                0              2

另一种方法:在相应的“结束”列之上堆叠“Start.Date”和“Start.Area”列,使用新列“Pos”将列重命名为“Date”和“Area”,指定是否这是一个'开始'或'结束'。然后通过对Area,Date或两者进行分组很容易进行汇总。

m <- rbind(`names<-`(dat[,grep("Start", names(dat))], c("Date", "Area")),
           `names<-`(dat[,grep("End", names(dat))], c("Date", "Area")))
m$Pos <- rep(c("Start", "End"), each=nrow(dat))

m %>% group_by(as.Date(Date), Area) %>%
  summarise(Start.Occurences = sum(Pos == "Start"),
            End.Occurences = sum(Pos == "End"))
  as.Date(Date)          Area Start.Occurences End.Occurences
# 1    2007-07-12   High Street                1              0
# 2    2007-07-12  Kings Street                1              0
# 3    2007-07-12    New Street                1              1
# 4    2007-07-12    Windy Lane                0              2