【问题标题】:R dplyr count occurences of separate events in time series dataR dplyr 计算时间序列数据中单独事件的发生次数
【发布时间】:2015-12-22 09:25:17
【问题描述】:

我对 dplyr 有点小白,我知道这很容易解决。我有某些事件的数据,“X”、“Y”和“Z”以及这些事件发生的日期列表。可以通过以下方式生成示例:

days.14<-seq(as.Date("2014/1/1"),as.Date("2014/12/31"),by="days")
X<-c("X","")
Y<-c("Y","")
Z<-c("Z","")
data<-as.data.frame(sample(days.14,200,replace=TRUE))
data$X<-sample(X,200,replace=TRUE)
data$Y<-sample(Y,200,replace=TRUE)
data$Z<-sample(Z,200,replace=TRUE)
names(data)[1]<-"date"
data<-data[order(as.Date(data$date, format="%Y-%m-%d")),]

我正在尝试使用 dplyr 包对按天分组的每个事件进行计数。因此,不是数据中的一行表示事件发生的日期,而是数据集中的所有日期以及每个事件发生的次数。所以不要像这样:

2014-01-01     Z
2014-01-01   Y Z
2014-01-01 X
2014-01-02 X Y Z

我正在尝试使用 dplyr 来获取:

  date        X Y Z
--------------------
2014-01-01    1 1 2
2014-01-01    1 1 1

我用来完成此操作的代码不适用于字符向量。

counts = data%>% group_by(factor(date))%>%
summarise(X=sum(X),
Y=sum(Y),
Z=sum(Z))

我通常生成计数的方式是通过 table 函数,但这不适用于 dplyr。

【问题讨论】:

  • 请在抽取随机样本之前使用set.seed构建示例。

标签: r count dplyr


【解决方案1】:

我会这样做:

library(dplyr)
data %>% group_by(date) %>%
         summarise_each(funs(sum(.!="")), -date)

为了完整起见,@David-Arenburg 提供了一个 data.table 解决方案:

library(data.table) 
setDT(data)[, lapply(.SD, function(x) sum(x != "")), by = date]

您的问题是您试图对行求和,因为该行不是数字,所以不起作用。

您需要检查 X、Y 或 Z 是否不是 ""NA 在 r 中更广泛地用作空白)。

我们可以使用summarise_each 在每一行上执行此操作,使用-date 确保不包括日期列。

注意,如果您只是想修复代码,这里是最简单的解决方案:

data %>% group_by(date)%>%
         summarise(X = sum(X == "X"),
                   Y = sum(Y == "Y"),
                   Z = sum(Z == "Z"))

【讨论】:

    【解决方案2】:

    另一种方法

    set.seed(1000)
    days.14<-seq(as.Date("2014/1/1"),as.Date("2014/12/31"),by="days")
    X<-c("X","")
    Y<-c("Y","")
    Z<-c("Z","")
    data<-as.data.frame(sample(days.14,200,replace=TRUE))
    data$X<-sample(X,200,replace=TRUE)
    data$Y<-sample(Y,200,replace=TRUE)
    data$Z<-sample(Z,200,replace=TRUE)
    names(data)[1]<-"date"
    data<-data[order(as.Date(data$date, format="%Y-%m-%d")),]
    library(reshape2)
    

    使用melt合并所有X,Y,Z

    summ<-data%>%melt(id.var="date")%>% group_by(factor(date))%>%summarize(X = sum(value=="X"), Y = sum(value=="Y"), Z = sum(value=="Z"))
    
    head(as.data.frame(summ))  
    
      factor(date) X Y Z
    1   2014-01-04 0 1 1
    2   2014-01-05 1 1 0
    3   2014-01-08 1 2 1
    4   2014-01-09 1 0 0
    5   2014-01-10 1 1 1
    6   2014-01-14 2 2 0
    

    【讨论】:

      【解决方案3】:

      另一种解决方案是recast (melt -> dcast) 数据

      library(reshape2)
      recast(data, date ~ variable, id.var = 1, fun.aggregate = function(x) sum(x != ""))
      

      【讨论】:

        【解决方案4】:

        这是使用 ddply 完成此任务的一种方法:

            ddply(data,.(date),function(x){
          xcount <- sum(grep("X",x$X))
          ycount <- sum(grep("Y",x$Y))
          zcount <- sum(grep("Z",x$Z))
          data.frame(X=xcount,Y=ycount,Z=zcount)
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多