R dplyr统计时间序列数据中单独事件的发生次数
我对dplyr有点不在行,我知道这很容易解决。我有某些事件的数据,“X”、“Y”和“Z”,以及这些事件发生的日期列表。可通过以下方式生成示例:R dplyr统计时间序列数据中单独事件的发生次数,r,count,dplyr,R,Count,Dplyr,我对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
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获得:
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不起作用。以下是使用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)
})
ddply(数据、日期)、函数(x){
xcount以下是使用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)
})
ddply(数据、日期)、函数(x){
xcount以下是我的做法:
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中更广泛地用作空白)
我们可以使用summary_each
在每行执行此操作,并使用-date
确保不包括日期列
注意:如果您只是想修复代码,以下是最简单的解决方案:
data %>% group_by(date)%>%
summarise(X = sum(X == "X"),
Y = sum(Y == "Y"),
Z = sum(Z == "Z"))
我会这样做:
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中更广泛地用作空白)
我们可以使用summary_each
在每行执行此操作,并使用-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)
set.seed(1000)
第14天,另一种方法
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)
set.seed(1000)
第14天另一个解决方案是重铸
(熔化
->dcast
)数据
另一种解决方案是重铸
(熔化
->dcast
)数据
在绘制随机样本之前,请使用set.seed
构建示例。在绘制随机样本之前,请使用set.seed
构建示例。