R中

R中

问题描述:

创建交错图表我有一个DF,看起来像这样:R中

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)) 

(其中CM =当月,PM =预测月)我想

df 

CM PM Value 
Jan Jan 8* 
Jan Feb 5 
Jan Mar 6 
Feb Feb 8* 
Feb Mar 3 
Mar Mar 4* 
Mar Apr 7 
Mar May 6 
Apr Apr 7* 
Apr May 1 
Apr Jun 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表示实际值。

+0

请重复的例子,所以我们不都创建你的数据。 – Spacedman 2015-02-24 14:35:57

+0

“交错图”是指瀑布图(又名阶梯图或楼梯图)? – lawyeR 2015-02-24 14:40:29

+0

@Spacedman固定。 – emehex 2015-02-24 14:43:37

您可以使用dcastreshape2包:

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="") 

你的榜样给这个:

CM Jan Feb Mar Apr May Jun 
1 Jan 8 5 6    
2 Feb  8 3    
3 Mar   4 7 6  
4 Apr    7 1 3 

要添加星星:

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 

给出:

+0

使用'levels = unique(data $ C.M)'(和'$ P.M')将会节省一些打字和保存订单。除非数据已经是因素(我们不知道!!!),或者在所有12个月中使用'month.abb'。 – Spacedman 2015-02-24 14:44:03

+0

感谢您的评论,将其更改为'month.abb'以获得正确的订单 – NicE 2015-02-24 14:47:08

+0

@NicE为什么我的“可重现”df不生成我的初始打印? – emehex 2015-02-24 15:01:30

根据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 
+0

理想情况下,我想要输出月份。没有零占位符。 – emehex 2015-02-24 14:50:17

+0

为什么没有零?你有数字值,你只是在这种情况下在字符中破坏它们。此外,如果您需要订购,您可以使用'订单',但我不明白为什么它可能是如此必要。 – 2015-02-24 15:08:01

您可以使用下面的太

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)