【问题标题】:Converting vectors into 2D matrix [duplicate]将向量转换为二维矩阵
【发布时间】:2013-05-26 18:07:51
【问题描述】:

我的数据如下所示:

   total position division
 34        C      ATL
 34        C      CEN
 47        C       NE
 46        C       NW
 44        C      PAC
 42        C       SE
 57        D      ATL
 50        D      CEN
 44        D       NE
 52        D       NW
 42        D      PAC
 52        D       SE
 29        L      ATL
 34        L      CEN
 28        L       NE
 34        L       NW
 29        L      PAC
 24        L       SE
 26        R      ATL
 33        R      CEN
 25        R       NE
 29        R       NW
 24        R      PAC
 35        R       SE

我希望将其转换为 2D 矩阵,然后可用于卡方检验。所以,我的输入需要看起来像:

division        position
            C       D       L       R
ATL         34      57      29      26
CEN         34      50      34      33
NE          47      44      28      25
NW          46      52      34      29
PAC         44      42      29      24
SE          42      52      24      35

简而言之,我需要在其中一个向量列标题中创建值,并在其他向量行标题中创建值。每行中出现的总值应移动到生成的 2D 矩阵中的行标题和列标题的交点(例如 NE 和 D 为 44)。

顺序并不重要,任何向量都可以是最终矩阵中的一行或一列,输入总是有三列:total、foo 和 bar。

我怎样才能做到这一点?我不想在 R 中求助于一些程序性的东西,而我目前在 R 中的技能有些欠缺。

谢谢。

【问题讨论】:

    标签: r vector matrix reshape


    【解决方案1】:

    这是一个基本的reshape 问题(有关详细信息,请参阅?reshape)。

    使用基础 R,您可以执行以下操作(假设您的数据称为“mydf”):

    > reshape(mydf, direction = "wide", idvar = "division", timevar = "position")
      division total.C total.D total.L total.R
    1      ATL      34      57      29      26
    2      CEN      34      50      34      33
    3       NE      47      44      28      25
    4       NW      46      52      34      29
    5      PAC      44      42      29      24
    6       SE      42      52      24      35
    

    或者,您可以使用xtabs,如下所示。给定组合的多个值将相加:

    > xtabs(total ~ division + position, mydf)
            position
    division  C  D  L  R
         ATL 34 57 29 26
         CEN 34 50 34 33
         NE  47 44 28 25
         NW  46 52 34 29
         PAC 44 42 29 24
         SE  42 52 24 35
    

    【讨论】:

    • 非常好,感谢您的及时回复!
    【解决方案2】:

    这是另一种方法,只需制作一个矩阵:

    matrix(df$total, ncol=4, dimnames=list(unique(df$division), unique(df$position)))
    
    ##      C  D  L  R
    ## ATL 34 57 29 26
    ## CEN 34 50 34 33
    ## NE  47 44 28 25
    ## NW  46 52 34 29
    ## PAC 44 42 29 24
    ## SE  42 52 24 35
    

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2019-05-02
      • 2017-06-10
      相关资源
      最近更新 更多