我在表格中有一堆数据(从csv导入),格式如下:
date classes score
9/1/11 french 34
9/1/11 english 34
9/1/11 french 34
9/1/11 spanish 34
9/2/11 french 34
9/2/11 english 34
9/3/11 spanish 34
9/3/11 spanish 34
9/5/11 spanish 34
9/5/11 english 34
9/5/11 french 34
9/5/11 english 34
忽略得分列,这并不重要。
我需要根据日期计算英语,西班牙语或法语课程的学生总数,即。我需要先按日期对其进行分组,然后根据语言将每一天划分为更多的块,并将其绘制为堆积条形图,使其如下所示。每个条形代表一个日期,条形的每个横截面代表一种语言。
一旦我以矩阵形式获取数据,我已经想出了如何做到这一点,其中每行代表一个日期,每一列代表一个属性(或语言)。所以我假设数据是在csv中的那种形式:
ie french english spanish
9/1/11 2 1 1
9/2/11 1 1 0
9/3/11 0 0 2
9/5/11 1 2 1
然后我可以做到:
directory<-"C:\\test\\language.csv"
ourdata6<-read.csv(directory)
language<-as.matrix(ourdata6)
barchart(prop.table(language), horizontal=FALSE, auto.key = list(space='right',cex=.5,border=T,points=F, lines=F,lwd=5,text=c('french','spanish','enligsh'),cex=.6), main = list(label="Distribution of classes 10",cex=2.5), ylab = list(", cex=1.7),xlab.top=list("testing",cex=1.2))
挑战在于将原始格式的数据转换为我需要的格式。
我试过
a<-count(language, c("date", "classes"))
它给出了按两者排序的计数,但是它是以垂直形式排序的
ie
9/1/11 french 2
9/1/11 english 1
9/1/11 spanish 1
etc...
我需要对此进行透视,以便每个日期成为一行。如果其中一些可能为零,那么我需要占位符,即。第一列必须与法语相对应,第二列必须与我的当前设置相对应的英语。
关于如何做到这一点的任何想法,或者我对矩阵+ prop.table的方法是否正确?有没有更简单的方法呢?
答案 0 :(得分:4)
假设您的数据位于名为df
的数据框中,您可以借助dplyr
和tidyr
软件包执行此操作:
library(dplyr)
library(tidyr)
wide <- df %>% select(date,classes) %>%
group_by(date,classes) %>%
summarise(n=n()) %>% # as @akrun said, you can also use tally()
spread(classes, n, fill=0)
使用您提供的示例数据,会产生以下数据框:
date english french spanish
9/1/11 1 2 1
9/2/11 1 1 0
9/3/11 0 0 2
9/5/11 2 1 1
现在,您可以使用以下内容制作lattice
地块
barchart(date ~ english + french + spanish, data=wide, stack = TRUE,
main = list(label="Distribution of language classes",cex=1.6),
xlab = list("Number of classes", cex=1.1),
ylab = list("Date", cex=1.1),
auto.key = list(space='right',cex=1.2,text=c('Enligsh','French','Spanish')))
给出了以下情节:
编辑:您也可以使用ggplot2
,而不是使用格子图,这在(至少在我看来)更容易理解。一个例子:
# convert the wide dataframe to a long one
long <- wide %>% gather(class, n, -date)
# load ggplot2
library(ggplot2)
# create the plot
ggplot(long, aes(date, n, fill=class)) +
geom_bar(stat="identity", position="stack") +
coord_flip() +
theme_bw() +
theme(axis.title=element_blank(), axis.text=element_text(size=12))
给出:
答案 1 :(得分:4)
我希望我没有遗漏任何东西,但在我看来,你只是在寻找table
:
table(df[c("date", "classes")])
# classes
# date english french spanish
# 9/1/11 1 2 1
# 9/2/11 1 1 0
# 9/3/11 0 0 2
# 9/5/11 2 1 1
结果是table
(也是matrix
),因此您可以根据需要使用barchart
命令。
这就是我得到的 - 看起来你需要处理你的传奇: - )
使用的代码是:
language <- table(df[c("date", "classes")])
barchart(prop.table(language),
horizontal = FALSE,
auto.key = list(space = 'right',
cex = .5, border = T, points = F,
lines = F, lwd = 5,
text = c('french','spanish','enligsh'),
cex = .6),
main = list(label = "Distribution of classes 10", cex = 2.5),
ylab = list("", cex = 1.7),
xlab.top = list("testing", cex = 1.2))