【问题标题】:rearrange data from short to long form in R在R中将数据从短格式重新排列为长格式
【发布时间】:2014-04-23 10:01:12
【问题描述】:

我有以下方式的数据:

         level1  level2  level3  level4
controls  x_11    x_12    x_13    x_14
cases     x_21    x_22    x_23    x_24

长篇大论的最佳方式是什么?具体来说,我想要在级别 0 的 x_11 行,然后是 0 的指示符,级别指示符为 0 的 x_12 行?

我正在尝试将其放入 coin 库中的 independence_test 函数中,这就是它需要的数据。谢谢!

编辑

我有这个矩阵:

         1 2 3 4
controls 9 7 7 7
cases    0 1 1 5

如何获得 37x2 的矩阵。每行都有“状态”和“bin”。例如,我会得到 9 行

0, 1(控制,bin =1)

然后是 7 行: 0,2(控制,bin = 2)

...

0 行: 0,1(大小写,bin = 1)

1,2(大小写,bin=2)

谢谢!

编辑 2 将输入/输出输入到以下一种解决方案:

> dput(mtx)
structure(c(9L, 0L, 7L, 1L, 7L, 1L, 7L, 5L), .Dim = c(2L, 4L), .Dimnames = list(
    c("controls", "cases"), c("1", "2", "3", "4")))

输入(长) 结构(c(“1”,“1”,“1”,“1”,“1”,“1”,“1”,“1”,“1”,“3”, “3”、“3”、“3”、“3”、“3”、“3”、“4”、“1”、“1”、“1”、“1”、“1”、“1” ", “1”、“2”、“3”、“3”、“3”、“3”、“3”、“3”、“3”、“4”、“4”、“4”、“4” ", “4”、“控制”、“控制”、“控制”、“控制”、“控制”、 “控制”、“控制”、“控制”、“控制”、“控制”、“控制”、 “控制”、“控制”、“控制”、“控制”、“控制”、“案例”、 “控制”、“控制”、“控制”、“控制”、“控制”、“控制”、 “控制”、“案例”、“控制”、“控制”、“控制”、“控制”、 “控制”、“控制”、“控制”、“案例”、“案例”、“案例”、 “案例”,“案例”),.Dim = c(37L,2L),.Dimnames = list(NULL, c("", "状态")))

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您想将数据从宽更改为长,melt 函数非常有用。我试图创建一个玩具数据集,以便可以回答您的问题,尽管它可能不是您想要的(如果没有特定的、可重复的示例数据,很难“猜测”某人想要做什么)设置)。

    首先我们将在 R 中创建一个玩具数据集:

    df.wide <- as.data.frame(matrix(1:8,2))
    colnames(df.wide) <- c("Level 1", "Level 2", "Level 3", "Level 4")
    rownames(df.wide) <- c("Controls", "Cases")
    
    # creating an id variable for the rows
    df.wide$id <- rownames(df.wide)
    
    # examining the dataframe
    print(df.wide)
    Level 1 Level 2 Level 3 Level 4       id
    Controls       1       3       5       7 Controls
    Cases          2       4       6       8    Cases
    

    现在我们从宽转换为长:

    require(reshape2)
    df.long <- melt(df.wide)
    print(df.long)
    
    id variable value
    1 Controls  Level 1     1
    2    Cases  Level 1     2
    3 Controls  Level 2     3
    4    Cases  Level 2     4
    5 Controls  Level 3     5
    6    Cases  Level 3     6
    7 Controls  Level 4     7
    8    Cases  Level 4     8
    

    【讨论】:

    • 抱歉需要一些不同的东西。我已经进行了编辑,并提供了更多详细信息。你能看一下吗?
    【解决方案2】:

    as.data.frame.table 函数和 rep 函数一起可以做你想做的事:

    > m <- matrix(1:12, 4)
    > df <- as.data.frame.table(m)
    > df[ rep(1:nrow(df), df$Freq), ]
          Var1 Var2 Freq
    1        A    A    1
    2        B    A    2
    2.1      B    A    2
    3        C    A    3
    3.1      C    A    3
    3.2      C    A    3
    4        D    A    4
    4.1      D    A    4
    4.2      D    A    4
    4.3      D    A    4
    5        A    B    5
    5.1      A    B    5
    .
    .
    .
    

    另一种选择可能是查看 reshap2 或 plyr 包。

    【讨论】:

      【解决方案3】:

      假设列联矩阵称为mtx:

           cbind( bin=unlist(mapply( rep, times=mtx, rownames(mtx)[row(mtx)] )), 
                  status=unlist(mapply( rep, times=mtx, colnames(mtx)[col(mtx)] ))
                )
        #--------------------------
            bin        status
       [1,] "controls" "1"   
       [2,] "controls" "1"   
       [3,] "controls" "1"   
       [4,] "controls" "1"   
       [5,] "controls" "1"   
       [6,] "controls" "1"   
       [7,] "controls" "1"   
       [8,] "controls" "1"   
       [9,] "controls" "1"   
      [10,] "controls" "2"   
      [11,] "controls" "2"   
      [12,] "controls" "2"   
      [13,] "controls" "2"   
      [14,] "controls" "2"   
      [15,] "controls" "2"   
      [16,] "controls" "2"   
      [17,] "cases"    "2"   
      [18,] "controls" "3"   
      [19,] "controls" "3"   
      [20,] "controls" "3"   
      [21,] "controls" "3"   
      [22,] "controls" "3"   
      [23,] "controls" "3"   
      [24,] "controls" "3"   
      [25,] "cases"    "3"   
      [26,] "controls" "4"   
      [27,] "controls" "4"   
      [28,] "controls" "4"   
      [29,] "controls" "4"   
      [30,] "controls" "4"   
      [31,] "controls" "4"   
      [32,] "controls" "4"   
      [33,] "cases"    "4"   
      [34,] "cases"    "4"   
      [35,] "cases"    "4"   
      [36,] "cases"    "4"   
      [37,] "cases"    "4"   
      

      要了解它是如何工作的,您可以使用这样的矩阵:

      dput(mtx)
      structure(c(9, 0, 7, 1, 7, 1, 7, 5), .Dim = c(2L, 4L), .Dimnames = list(
          c("controls", "cases"), c("1", "2", "3", "4")))
      

      【讨论】:

      • 这不起作用。矩阵不正确。例如,我在 bin 4 中没有找到带有“控件”的行。
      • 我刚刚再次运行它,它“工作”就好了。如果您想要替代解决方案(替代问题),您需要在您的对象上发布dput()
      • 我已经添加了 dput 输入和输出。例如,对于您的矩阵,我看不到“控件,4”的元素。
      • 啊。我现在明白了。列名被混淆了。应该与编辑一起工作。
      • @BodedDust,很抱歉,但我仍然认为它不起作用。您修改后的代码没有显示“2”“案例”的行
      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2022-07-28
      • 2020-10-23
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多