在R中创建交错图表
我有一个df,看起来像这样:在R中创建交错图表,r,R,我有一个df,看起来像这样: df <- data.frame( CM = c("Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", "Mar", "Apr", "Apr", "Apr"), PM = c("Jan", "Feb", "Mar", "Feb", "Mar", "Mar", "Apr", "May", "Apr", "May", "Jun"), Value = c(8, 5, 6, 8, 3, 4, 7, 6, 7, 1
df <- data.frame(
CM = c("Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", "Mar", "Apr", "Apr", "Apr"),
PM = c("Jan", "Feb", "Mar", "Feb", "Mar", "Mar", "Apr", "May", "Apr", "May", "Jun"),
Value = c(8, 5, 6, 8, 3, 4, 7, 6, 7, 1, 3))
我想把这些整洁的数据转换成交错的图表
Prediction
Jan Feb Mar Apr May Jun ...
M|Jan 8* 5 6
O|Feb 8* 3
N|Mar 4* 7 6
T|Apr 7* 1 3
H|...
*s表示实际值 您可以从
重塑2
软件包中使用dcast
:
library(reshape2)
df <- data.frame(
CM = c("Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", "Mar", "Apr", "Apr", "Apr"),
PM = c("Jan", "Feb", "Mar", "Feb", "Mar", "Mar", "Apr", "May", "Apr", "May", "Jun"),
Value = c(8, 5, 6, 8, 3, 4, 7, 6, 7, 1, 3))
df$CM<-factor(df$CM,levels=month.abb)
df$PM<-factor(df$PM,levels=month.abb)
dcast(df,CM~PM,value.var="Value",fill="")
要添加星星:
res<-dcast(df,CM~PM,value.var="Value",fill="")
row.names(res)<-res[,1]
res<-res[,-1]
for(i in 1:nrow(res)){
res[i,i]<-paste0(res[i,i],"*")
}
res
根据
df
中的数值,您可以尝试以下操作:
>df$CM<-factor(df$CM,levels=month.abb)
>df$PM<-factor(df$PM,levels=month.abb)
>xtabs(Value ~ CM + PM, df)
PM
CM Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Jan 8 5 6 0 0 0 0 0 0 0 0 0
Feb 0 8 3 0 0 0 0 0 0 0 0 0
Mar 0 0 4 7 6 0 0 0 0 0 0 0
Apr 0 0 0 7 1 3 0 0 0 0 0 0
May 0 0 0 0 0 0 0 0 0 0 0 0
Jun 0 0 0 0 0 0 0 0 0 0 0 0
Jul 0 0 0 0 0 0 0 0 0 0 0 0
Aug 0 0 0 0 0 0 0 0 0 0 0 0
Sep 0 0 0 0 0 0 0 0 0 0 0 0
Oct 0 0 0 0 0 0 0 0 0 0 0 0
Nov 0 0 0 0 0 0 0 0 0 0 0 0
Dec 0 0 0 0 0 0 0 0 0 0 0 0
>df$CMdf$PMxtabs(值~CM+PM,df)
颗粒物
CM一月二月三月四月五月六月七月八月九月十月十一月十二月
一月八日五六○○○
二月零八三零零零零零
三月零四七六零零零零
四月零零零七一三零零零零
五月零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零
六月零零零零零零零零
七月零零零零零零零零
八月零零零零零零零零
九月零零零零零零零零
十月零零零零零零零零
十一月零零零零零零零零
十二月零零零零零零零零
您也可以使用以下选项
data<- structure(list(C.M = structure(c(3L, 3L, 3L, 2L, 2L, 4L, 4L,
4L, 1L, 1L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"),
P.M = structure(c(3L, 2L, 5L, 2L, 5L, 5L, 1L, 6L, 1L, 6L,
4L), .Label = c("Apr", "Feb", "Jan", "Jun", "Mar", "May"), class = "factor"),
Value = structure(c(8L, 4L, 5L, 8L, 2L, 3L, 6L, 5L, 7L, 1L,
2L), .Label = c("1", "3", "4*", "5", "6", "7", "7*", "8*"
), class = "factor")), .Names = c("C.M", "P.M", "Value"), class = "data.frame", row.names = c(NA,
-11L))
df <- as.data.frame(reshape(data,idvar="C.M",timevar="P.M",direction="wide"))
print (df)
data请给出一个可复制的示例,这样我们就不必创建您的数据。所谓“交错图”是指瀑布图(也称阶梯图或阶梯图)?@我不这么认为。我希望输出与我的输出表相似。示例数据中没有星星。他们来自哪里?就在对角线上?你想在打印时看到星星吗?我考虑了你的原始数据,提出了一个解决方案。frame,但是星星是干什么的?仅提及对角线术语?使用levels=unique(data$C.M)
(和$P.M
)将节省一些输入并保持顺序。除非数据已经存在(我们不知道!!!)或全部12个月使用month.abb
。感谢您的评论,请将其更改为month.abb
,以获得正确信息order@NicE为什么我的“可复制”df不能生成我的初始打印?删除样本
,你在生成随机数据帧,我在回答中更改了它,我想把产量整理好。没有零占位符,为什么没有零占位符?在本例中,您有数值,只是在字符中破坏了它们。此外,如果您需要订购,您可以使用order
,尽管我不明白为什么这么必要。
Jan Feb Mar Apr May Jun
Jan 8* 5 6
Feb 8* 3
Mar 4* 7 6
Apr 7* 1 3
>df$CM<-factor(df$CM,levels=month.abb)
>df$PM<-factor(df$PM,levels=month.abb)
>xtabs(Value ~ CM + PM, df)
PM
CM Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Jan 8 5 6 0 0 0 0 0 0 0 0 0
Feb 0 8 3 0 0 0 0 0 0 0 0 0
Mar 0 0 4 7 6 0 0 0 0 0 0 0
Apr 0 0 0 7 1 3 0 0 0 0 0 0
May 0 0 0 0 0 0 0 0 0 0 0 0
Jun 0 0 0 0 0 0 0 0 0 0 0 0
Jul 0 0 0 0 0 0 0 0 0 0 0 0
Aug 0 0 0 0 0 0 0 0 0 0 0 0
Sep 0 0 0 0 0 0 0 0 0 0 0 0
Oct 0 0 0 0 0 0 0 0 0 0 0 0
Nov 0 0 0 0 0 0 0 0 0 0 0 0
Dec 0 0 0 0 0 0 0 0 0 0 0 0
data<- structure(list(C.M = structure(c(3L, 3L, 3L, 2L, 2L, 4L, 4L,
4L, 1L, 1L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"),
P.M = structure(c(3L, 2L, 5L, 2L, 5L, 5L, 1L, 6L, 1L, 6L,
4L), .Label = c("Apr", "Feb", "Jan", "Jun", "Mar", "May"), class = "factor"),
Value = structure(c(8L, 4L, 5L, 8L, 2L, 3L, 6L, 5L, 7L, 1L,
2L), .Label = c("1", "3", "4*", "5", "6", "7", "7*", "8*"
), class = "factor")), .Names = c("C.M", "P.M", "Value"), class = "data.frame", row.names = c(NA,
-11L))
df <- as.data.frame(reshape(data,idvar="C.M",timevar="P.M",direction="wide"))
print (df)