代码之家  ›  专栏  ›  技术社区  ›  F. Privé

具有标识值的平板

  •  1
  • F. Privé  · 技术社区  · 7 年前

    我有一个整洁的数据框架:

    mydf <- expand.grid(
      A = letters[1:3],
      B = letters[4:5],
      C = letters[6:7], 
      stringsAsFactors = FALSE
    )
    mydf$D = runif(nrow(mydf))
    

    我想把它做成一张像 myft <- ftable(mydf, row.vars = 1, col.vars = 2:3) D .

    我试过使用 myft[] <- mydf$D ,这更好,但数值顺序不好。如何匹配相同的顺序(即 D 对应于参数值的 A , B C )?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nathan Werth    7 年前
    myarray <- xtabs(D ~ A + B + C, data = mydf)
    ftable(myarray, row.vars = 1, col.vars = 2:3)
    
        2
  •  1
  •   A5C1D2H2I1M1N2O1R2T1    7 年前

    我理解你的问题特别要求 ftable ,但您可能会发现更直接的方法是使用一些更常见的函数来重塑数据。

    例如,这里是 dcast 从“数据表”:

    library(data.table)
    dcast(as.data.table(mydf), A ~ ..., value.var = "D")
    ##    A       d_f       d_g       e_f        e_g
    ## 1: a 0.2655087 0.9446753 0.9082078 0.06178627
    ## 2: b 0.3721239 0.6607978 0.2016819 0.20597457
    ## 3: c 0.5728534 0.6291140 0.8983897 0.17655675
    

    以下是“tidyverse”方法:

    library(tidyverse)
    mydf %>% 
      unite(var, B, C) %>% 
      spread(var, D)
    ##   A       d_f       d_g       e_f        e_g
    ## 1 a 0.2655087 0.9446753 0.9082078 0.06178627
    ## 2 b 0.3721239 0.6607978 0.2016819 0.20597457
    ## 3 c 0.5728534 0.6291140 0.8983897 0.17655675
    

    我建议这样做是因为这些格式更容易通过可预测的列名进行索引和引用。在一个 可折叠 ,你实际上没有 dimnames 但是“col.vars”和“row.vars”访问起来并不方便。因此,你不能做像这样的事情 data.frame(myft) 甚至 as.data.frame.matrix(myft) 并保持重塑后桌子的形状。


    回答您在尝试时如何匹配变量顺序的问题 myft[] <- ... ,您可以尝试以下操作:

    • 在这种情况下,根据因子列(A、B和C)重新排列“D”的值。
    • 将其转换为行矩阵。您应该能够轻松地计算数据所需的行数。
    • 使用该矩阵作为替换值。

    例子:

    myft[] <- matrix(mydf$D[with(mydf, do.call(order, list(A, B, C)))], 
                     nrow = length(unique(mydf$A)), byrow = TRUE)
    myft
    #   B          d                     e           
    #   C          f          g          f          g
    # A                                              
    # a   0.26550866 0.94467527 0.90820779 0.06178627
    # b   0.37212390 0.66079779 0.20168193 0.20597457
    # c   0.57285336 0.62911404 0.89838968 0.17655675