如何从矩阵数据转换为面板格式

时间:2016-06-05 14:43:09

标签: r matrix reshape sapply

我是R的初学者。因此,这个问题可以被认为是一个基本问题。

当A,B或C = 0时,我试图将矩阵格式的数据转换为面板数据格式例如:

set.seed(0); mat <- matrix(sample(0:1, 16, replace=T), ncol=4, nrow=4)
colnames (mat) <- c("A", "B", "C", "D")
rownames (mat) <- c("1","2", "3", "4")

采用以下面板格式:

A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4

对于变量&#34; 1&#34; - &#34; 4&#34;是0.

我尝试使用plyr包中的apply代码。有人能为我提供正确的代码和论据,让R知道它应该提取A,B,C或D,如果&#34; 1&#34; = 0并重复相同的过程&#34; 2&#34;, &#34; 3&#34;和&#34; 4&#34;并且R将输出置于前者之下的新数据帧中?

我意识到上述问题不够明确。因此,我可以通过mtcars数据集更清楚地了解它。

cars <- mtcars

如果是这个数据集,我想要的格式是:

Mazda RX4     | mpg   | 21.0
Mazda RX4     | cyl   | 6
Mazda RX4     | disp  | 160.0
...
Mazda RX4 Wag | mpg   | 21.0
Mazda RX4 Wag | cyl   | 6
...

等等。

2 个答案:

答案 0 :(得分:0)

注释:您一直将行引用为变量。将变量连续排在最不容易的情况下,如果不直接危险,因为人们期望变量在列中! 如果您的变量被称为"1",...,"4",那么我认为A,...,D是指您的观察结果?这会更令人困惑......

如果你对数据整洁的内容感兴趣,你应该阅读Hadley Wickhams的揭示article on tidy data

编辑:

关于您的问题

使用mtcarstidyr包中的dplyr数据集和函数:

require(tidyr)
require(dplyr)

mtcars %>% 
 add_rownames() %>% 
 gather("id", "value", mpg:carb) %>% 
 arrange(rowname)

Source: local data frame [352 x 3]

       rowname    id   value
         (chr) (chr)   (dbl)
1  AMC Javelin   mpg  15.200
2  AMC Javelin   cyl   8.000
3  AMC Javelin  disp 304.000
4  AMC Javelin    hp 150.000
5  AMC Javelin  drat   3.150
6  AMC Javelin    wt   3.435
7  AMC Javelin  qsec  17.300
8  AMC Javelin    vs   0.000
9  AMC Javelin    am   0.000
10 AMC Javelin  gear   3.000
..         ...   ...     ...

如果您不知道%>%运算符(称为管道运算符),请将其读作“然后”。

答案 1 :(得分:0)

对于这段代码的mtcar示例

library(data.table)
cars <- as.data.table(mtcars, keep.rownames = TRUE)
melt(cars, id.vars = "rn")[order(rn)]

将给出

              rn variable  value
  1: AMC Javelin      mpg  15.20
  2: AMC Javelin      cyl   8.00
  3: AMC Javelin     disp 304.00
  4: AMC Javelin       hp 150.00
  5: AMC Javelin     drat   3.15
 ---                            
348:  Volvo 142E     qsec  18.60
349:  Volvo 142E       vs   1.00
350:  Volvo 142E       am   1.00
351:  Volvo 142E     gear   4.00
352:  Volvo 142E     carb   2.00

请注意,mtcarsdata.frame而不是matrix

Q中给出的矩阵mat的解决方案是

melt(as.data.table(mat, keep.rownames = TRUE), id.vars = "rn")[value == 0][
  order(variable, rn), .(variable, rn)]

将返回

    rn variable value
1:        A  2
2:        A  3
3:        B  2
4:        C  3
5:        C  4
6:        D  1
7:        D  3