【问题标题】:Preserve row and column order of data frame when converting data frame to matrix将数据框转换为矩阵时保留数据框的行列顺序
【发布时间】:2019-02-13 19:33:21
【问题描述】:

我有一个数据框:

 df<- data.frame(lep= c("Tarchon", "Tarchon", "Tarchon", "Tarchon", "Tarchon", 
               "Gonodonta","Gonodonta","Gonodonta", "Apatelodes"), 
               plant=c("Amphimoea","Desmotrichia", "Paches", "Neoxeniades",
                       "Desmotrichia","Neoxeniades","Amphimoea", "Acribia","Sychesia"), 
               freq=c(2,5,1,3,4,2,1,1,4))

我使用以下方法转换为矩阵:

mat1<-acast(df, plant~lep, value.var="freq", sum)

输出按字母顺序排列plantlep 的名称,但是我希望在矩阵中维护数据框中的顺序。

这是所需的输出:

 mdat <- matrix(c(2,5,1,3,0,0,1,0,0,2,0,0,0,0,0,0,0,4), nrow = 6, ncol = 3, byrow = TRUE,
           dimnames = list(c("Amphimoea","Desmotrichia", "Paches", "Neoxeniades",
                             "Acribia","Sychesia"),
                           c("Tarchon","Gonodonta", "Apatelodes")))

我并不偏爱使用acast,我刚刚发现这个函数对我拥有的数据框类型很有帮助。我无法在acast 中找到保留数据帧顺序的参数。

【问题讨论】:

    标签: r dataframe matrix reshape2


    【解决方案1】:

    因子将按其级别的顺序排序,默认情况下按字母顺序排列。您可以使用factorlevels 参数指定不同的顺序。 unique 将按照它们出现的顺序返回唯一值,我们可以在这里使用:

    df$lep = factor(df$lep, levels = unique(df$lep))
    df$plant = factor(df$plant, levels = unique(df$plant))
    
    reshape2::acast(df, plant~lep, value.var="freq", sum)
    #              Tarchon Gonodonta Apatelodes
    # Amphimoea          2         1          0
    # Desmotrichia       9         0          0
    # Paches             1         0          0
    # Neoxeniades        3         2          0
    # Acribia            0         1          0
    # Sychesia           0         0          4
    

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2020-04-21
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      相关资源
      最近更新 更多