带有标识值的平面表

时间:2017-12-01 15:53:36

标签: r reshape

我有这个整洁的数据框:

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的值与参数ABC的值相对应?

2 个答案:

答案 0 :(得分:1)

myarray <- xtabs(D ~ A + B + C, data = mydf)
ftable(myarray, row.vars = 1, col.vars = 2:3)

答案 1 :(得分:1)

我理解你的问题特别要求ftable,但你可能会发现更简单地使用一些用于重塑数据的更常见函数。

此处,例如来自&#34; data.table&#34;的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

这里是&#34; tidyverse&#34;的方法:

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

我建议这样做只是因为这些格式更易于通过可预测的列名进行索引和引用。在ftable中,您实际上没有dimnames但是&#34; col.vars&#34;和&#34; row.vars&#34;,这些都不方便访问。因此,您无法执行data.frame(myft)甚至as.data.frame.matrix(myft)之类的操作,并保持重塑表格的形状。

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

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

示例:

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