【问题标题】:How to convert from matrix like data to panel Format如何从类似矩阵的数据转换为面板格式
【发布时间】:2016-06-05 14:43:08
【问题描述】:

我是使用 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

对于变量“1”-“4”为0的每个字母。

我尝试使用 plyr 包中的应用代码。有人可以提供正确的代码和参数,让 R 知道如果“1”=0,它应该提取 A、B、C 或 D,并对“2”、“3”和“4”重复相同的过程,并且 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
...

等等。

【问题讨论】:

  • 您的预期结果似乎与您的代码 sn-p 创建的mat 不匹配。使用mat,我确实得到了 A2、A3、B2、C3、C4、D1、D3。这是预期的结果吗?

标签: r matrix reshape sapply


【解决方案1】:

注意:您一直将行称为变量。如果不是直接危险的话,将变量放在一行中至少会令人困惑,因为人们希望变量位于一列中! 如果您的变量称为"1",...,"4",那么我假设A,...,D 指的是您的观察结果?这会更令人困惑...

如果您对如何整理数据感兴趣,您应该阅读 Hadley Wickhams 揭示的 article on tidy data

编辑:

关于您的问题

使用mtcars 数据集和tidyrdplyr 包中的函数:

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
..         ...   ...     ...

如果您不知道%&gt;% 运算符(称为pipe-operator),请将其读为“然后”。

【讨论】:

    【解决方案2】:

    对于mtcarexample 这段代码

    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
    

    【讨论】:

    • 感谢您的评论。这段代码和 Manuel S 提供的代码都做得很好!非常感谢。
    • @GerwinColjé 那么,请您对这两个答案都投赞成票。谢谢。
    • 我做到了,但是我必须先获得 15 点声望点(从这周开始我是论坛的新人),然后投票才公开。 @UweBlock
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多