我有点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不起作用。
答案 0 :(得分:4)
这是我将如何做到的:
library(dplyr)
data %>% group_by(date) %>%
summarise_each(funs(sum(.!="")), -date)
为了完整起见,来自@ David-Arenburg的数据表解决方案:
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"))
答案 1 :(得分: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)
使用熔体巩固所有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
答案 2 :(得分:1)
另一种解决方案是recast
(melt
- &gt; dcast
)数据
library(reshape2)
recast(data, date ~ variable, id.var = 1, fun.aggregate = function(x) sum(x != ""))
答案 3 :(得分:0)
以下是使用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)
})