如何根据周数绘制汇总值

时间:2014-03-27 13:38:05

标签: r graph aggregate

我觉得这很简单,但是我被卡住了,我很感激你的帮助。

在我的数据中有4个问题,是/否答案,它们发生在每周期间。周期编号为dtf$Week。我需要做的是创建一个图表,每周计数y轴为“是”,x轴为周数。是的分数应该用不同颜色的4行表示。格式化很简单,但不幸的是,理解如何正确地汇总数据。我只是在学习R。

> str(dtf)
'data.frame':   55 obs. of  7 variables:
 $ id       : num  7 8 9 10 11 12 13 16 17 18 ...
 $ q_0001   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 1 1 1 ...
 $ q_0002   : Factor w/ 2 levels "Yes","No": 2 1 1 1 2 2 2 2 2 2 ...
 $ q_0003   : Factor w/ 2 levels "Yes","No": 2 2 2 1 2 2 2 2 2 2 ...
 $ q_0004   : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 2 2 2 ...
 $ Assm_Date: Date, format: "2014-01-04" "2014-01-08" ...
 $ Week     : num  1 1 1 1 1 1 1 2 2 2 ...

可以使用以下内容复制数据集:

# sample dataset
Start <- as.Date("2014-01-03")
Dates<-vector()
class(Dates) <- "Date"
i=1
for (i in 1:8) {
     End <- as.Date(Start+6)
     Samp <- Start + sort(sample.int(End-Start, 7,replace=TRUE))
     Dates <- append (Dates, Samp)
     Start <- End + 1
     i = i +1
}
id<-sort(sample(1:56))
q_0001<-sample(c("Yes","No"),56,replace=TRUE)
q_0002<-sample(c("Yes","No"),56,replace=TRUE)
q_0003<-sample(c("Yes","No"),56,replace=TRUE)
q_0004<-sample(c("Yes","No"),56,replace=TRUE)
dtf<-data.frame(id,Dates,q_0001,q_0002,q_0003,q_0004)
dtf$Week = 1 + as.numeric(dtf$Date - as.Date("2014-01-03")) %/% 7
rm(i,Dates,Start,End,Samp,id,q_0001,q_0002,q_0003,q_0004)

如果需要指向测试数据集的链接,也是here。对不起,我没有马上制作测试数据集,我对此有点新鲜。

2 个答案:

答案 0 :(得分:1)

这是一个ggplot解决方案。您可以在统计功能中使用ggplot,但这种情况很有效,除非在这种情况下需要一点点麻烦才能获得您正在寻找的内容(xlim和{{1}商业):

coord_cartesian

enter image description here

如果您愿意自己计算统计数据,那么在情节方面会变得更容易。在这里,我们使用library(ggplot2) library(reshape2) dtf.mlt <- melt(dtf[-(1:2)], id.vars="Week") # data in long format ggplot(subset(dtf.mlt, value=="Yes")) + stat_bin(aes(x=Week, color=variable), geom="line", position="identity", binwidth=1) + ylim(c(0, 7)) + xlim(1, 9) + coord_cartesian(xlim=c(0, 9)) 来计算每周/变量组合的数量:

aggregate

enter image description here

请注意,通过预先计算数据,我们不必为了使绘图看起来像我们想要的那样(包括x刻度)而乱七八糟。

答案 1 :(得分:1)

@ R0berts:它是dtf2的结构(str(dft2)还是它的计算方式(dtf2&lt; - ddply(....)?

这是另一种看待它的方式:

library(data.table)
library(reshape2)

df = data.table(df) # convert to data.table

# convert to long format
df2 = melt(df,id.vars = c("Week"), measure.vars = c("q_0001","q_0002","q_0003","q_0004"))

# get counts
df2 = df2[,sum(value == "Yes"),by = list(Week,variable)]