我觉得这很简单,但是我被卡住了,我很感激你的帮助。
在我的数据中有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。对不起,我没有马上制作测试数据集,我对此有点新鲜。
答案 0 :(得分:1)
这是一个ggplot
解决方案。您可以在统计功能中使用ggplot
,但这种情况很有效,除非在这种情况下需要一点点麻烦才能获得您正在寻找的内容(xlim
和{{1}商业):
coord_cartesian
如果您愿意自己计算统计数据,那么在情节方面会变得更容易。在这里,我们使用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
请注意,通过预先计算数据,我们不必为了使绘图看起来像我们想要的那样(包括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)]