簡體   English   中英

如何使用reshape2包中的melt()來堆疊數據的分類標簽以產生多個並排的boxpot

[英]How to use melt() from the reshape2 package to stack categorical labels of data to produce multiple side-by-side boxpots

我正在嘗試使用R中“reshape2”包中的melt() function來堆疊數據“reshape2” ,同時保留用於各個觀察的分類標簽。 我的問題是,我如何適應Eric Cai's code Code,以在行為級別$ family(2級因子列)的行為級別上生成多個並排的帶槽的箱線圖,該行為由稱為行為的數據集的每個行為變量分組(鏈接虛擬數據在下面提供)?

我的目標是用圖例為每個系列(V4=red and W3 = blue)為這些多個凹口箱形圖着色。 但是,在嘗試使用melt()函數排列數據框時遇到尺寸問題,我無法從中解譯。 如果有人可以提供幫助,則在此先多謝。

可重復的虛擬數據是在一個堆棧溢出頁面底部發現重復性數據

 Here is an example:

 I am trying to follow Eric Cai's instructions
 (1) Stack the data:
     (a) Retain the categorical (2 level factor column) for family [,1]
     (b) Retain all behavioural variables [,2:13]

  #Set vectors for labelling the data

                      behaviours.label=c("Swimming", 
                                         "Not.Swimming",
                                         "Running", 
                                         "Not.Running",
                                         "Fighting",
                                         "Not.Fighting",
                                         "Resting",
                                         "Not.Resting",
                                         "Hunting",
                                         "Not.Hunting",
                                         "Grooming",
                                         "Not.Grooming")

                         family.labels=c("V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8",
                                         "V4", "G8")

    library(tidyr)                        
    data_long <- gather(behaviours, x, Mean.Value, Swimming:Not.Grooming)
    head(data_long)  

    # stack the data while retaining the Family and behavioural variables 

    stacked.data = melt(behaviours, id = c('Family', 'behaviours'))

    # remove the column that gives the column name variable
    stacked.data = stacked.data[, -3]

    #head(stacked.data)
    colnames(stacked.data)<-c("Family", "Behaviours", "Values")

生成箱線圖

生成一個名為boxplots.double的對象,該對象將使用公式文本{Mean.value〜Family + Behaviours}將地塊分成12組doublet組(即,每個行為將在單個地塊的行為$ family級別進行分組)。 在Eric Cai的代碼中,“ at =”是一個選項,用於指定沿水平軸的箱形圖的位置,而xaxt ='n'禁止使用默認水平軸,該默認水平軸將自定義軸與axis()和title()一起添加

   boxplots.double = boxplot(values~Family + Behaviours, 
                             data = stacked.data, 
                             at = c(1:24), 
                             xaxt='n',
                             ylim = c(min(0, min(-3)), 
                             max(7, na.rm = T)),
                             notch=TRUE,
                             col = c("red", "blue"),
                             names = c("V4", "G8"),
                             cex.axis=1.0,
                             srt=45)

  axis(side=1, at=c(1.8, 6.8), labels=c("Swimming", 
                                       "Not.Swimming",
                                       "Running", 
                                       "Not.Running",
                                       "Fighting",
                                       "Not.Fighting",
                                       "Resting",
                                       "Not.Resting",
                                       "Hunting",
                                       "Not.Hunting",
                                       "Grooming",
                                       "Not.Grooming"), line=0.5, lwd=0)

錯誤信息

   Error in axis(side = 1, at = 1:24, labels = c("V4", "G8"), xaxt = "n",     : 
  'at' and 'labels' lengths differ, 24 != 2
  In addition: Warning message:
  In bxp(list(stats = c(-1.20186549488911, -0.970033304559564,   -0.465271399251147,  :
  some notches went outside hinges ('box'): maybe set notch=FALSE

理查德·特爾福德(Richard Telford)慷慨地提供幫助之后,此代碼使用reshape2包中包含的melt() function生成了多個分類箱圖,這些箱圖被歸類為稱為Family的分類列(2個級別)。

   clear the working directory
   rm(list=ls())

   data(behaviours)

   #Set vectors for labelling the data

   behaviours.labels=c("Swimming",  
                       "Not.Swimming",
                       "Running", 
                       "Not.Running",
                       "Fighting",
                       "Not.Fighting",
                       "Resting",
                       "Not.Resting",
                       "Hunting",
                       "Not.Hunting",
                       "Grooming",
                       "Not.Grooming")

       family.labels=c("V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8",
                       "V4", "G8")

      library(tidyr)

      #Structure the data from wide to long format 

      data_long <- gather(behaviours, x, Mean.Value, Swimming:Not.Grooming)
      head(data_long)    

   library(reshape2)

   # stack the data while retaining Family and Values calculated from behaviours[,2:13] using the melt() function

   stacked.data = melt(data_long, id = c('Family', 'x'))
   head(stacked.data)

   # remove the column that gives the column name of the `variable' from all.data

   stacked.data = stacked.data[, -3]
   head(stacked.data)

   #Rename the column headings

   colnames(stacked.data)<-c("Family", "Behaviours", "Values")    

   #Generate the side-by-side boxplots

   windows(height=10, width=14)
   par(mar = c(9, 7, 4, 4)+0.3, mgp=c(5, 1.5, 0))

   boxplots.double = boxplot(Values~Family + Behaviours, 
                             data = stacked.data, 
                             at = c(1:24), 
                             ylim = c(min(0, min(0)), 
                                      max(1.8, na.rm = T)),
                             xaxt = "n",
                             notch=TRUE,
                             col = c("red", "blue"),
                             cex.axis=0.7,
                             cex.labels=0.7,
                             ylab="Values", 
                             xlab="Behaviours",
                             space=1)

   axis(side = 1, at = seq(2, 24, by = 2), labels = FALSE)
   text(seq(2, 24, by=2), par("usr")[3] - 0.2, labels=unique(behaviours.labels), srt = 45, pos = 1, xpd = TRUE, cex=0.8)
   legend("topright", title = "Family", cex=1.0, legend=c("V4" , "G8"), fill=c("Blue", "Red"), lty = c(1,1))

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM