繁体   English   中英

时间序列数据中独立事件的R dplyr计数发生

[英]R dplyr count occurences of separate events in time series data

我对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))

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

这是我的处理方式:

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来确保不包括date列。

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

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

另一种方式

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)

使用熔体合并所有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

另一种解决方案是recastmelt -> dcast )数据

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

这是使用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)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM