【问题标题】:Turning a column into rows将一列变成行
【发布时间】:2011-04-29 08:37:24
【问题描述】:

例如,我有这些数据

Rows <- c(1,1,1,1,1,1,1,1,1,
    2,2,2,2,2,2,2,2,2,
    3,3,3,3,3,3,3,3,3,
    4,4,4,4,4,4,4,4,4,
    5,5,5,5,5,5,5,5,5,
    6,6,6,6,6,6,6,6,6,
    7,7,7,7,7,7,7,7,7,
    8,8,8,8,8,8,8,8,8,
    9,9,9,9,9,9,9,9,9)
Columns <- c(1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9)
Data <- c(1:81)

Dataset <- cbind(Rows,Columns)
Dataset <- cbind(Dataset,Data)

但这是 3 列。看起来像这样:

       Rows Columns Data
[1,]    1       1    1
[2,]    1       2    2
[3,]    1       3    3
[4,]    1       4    4
[5,]    1       5    5
[6,]    1       6    6

我需要的是一个看起来像这样的表:行列是 RowNrs,列列是 ColumnNrs,并且它上面的数据是受人尊敬的地方

       [,1][,2][,3][,4][,5][,6][,7][,8][,9]
[1,]    1   2   3   4   5   6   7   8   9
[2,]    10  11  12  13  14  15  16  17  18
[3,]    19  20  21  22  23  24  25  26  27
[4,]    28  29  30  31  32  33  34  35  36
[5,]    37  38  39  40  41  42  43  44  45
[6,]    46  47  48  49  50  51  52  53  54
[7,]    55  56  57  58  59  60  61  62  63
[8,]    64  65  66  67  68  69  70  71  72
[9,]    73  74  75  76  77  78  79  80  81

有没有办法将“数据集”操作到这个表中?

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    刚才有什么问题吗:

    m <- matrix(1:81, ncol = 9, nrow = 9, byrow = TRUE)
    rownames(m) <- colnames(m) <- 1:9
    
    > m
       1  2  3  4  5  6  7  8  9
    1  1  2  3  4  5  6  7  8  9
    2 10 11 12 13 14 15 16 17 18
    3 19 20 21 22 23 24 25 26 27
    4 28 29 30 31 32 33 34 35 36
    5 37 38 39 40 41 42 43 44 45
    6 46 47 48 49 50 51 52 53 54
    7 55 56 57 58 59 60 61 62 63
    8 64 65 66 67 68 69 70 71 72
    9 73 74 75 76 77 78 79 80 81
    

    或者如果Data 有什么特别之处:

    > Dataset <- cbind(Rows, Columns, 1:81)
    > matrix(Dataset[,3], ncol = max(Dataset[, 2]), nrow = max(Dataset[, 1]), 
    +        byrow = TRUE)
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
     [1,]    1    2    3    4    5    6    7    8    9
     [2,]   10   11   12   13   14   15   16   17   18
     [3,]   19   20   21   22   23   24   25   26   27
     [4,]   28   29   30   31   32   33   34   35   36
     [5,]   37   38   39   40   41   42   43   44   45
     [6,]   46   47   48   49   50   51   52   53   54
     [7,]   55   56   57   58   59   60   61   62   63
     [8,]   64   65   66   67   68   69   70   71   72
     [9,]   73   74   75   76   77   78   79   80   81
    

    【讨论】:

    • 这成功了,我正在处理一个更大的数据集,其中行和列没有排序。因此,如果我首先对数据进行排序并使用此代码(使用正确的名称),它就可以完美运行。谢谢
    【解决方案2】:

    也许

    matrix(Data, nrow = 9, ncol = 9, byrow = T)
    

    【讨论】:

    • 哈,我认为使用matrix 会做到这一点,但我心想 - 不,某处必须有一个陷阱。因此,我精心设计了解决方案。 :)
    • 我认为这将是最简单的方法。
    【解决方案3】:

    对于这种特殊情况,这应该可行。

    Dataset <- as.data.frame(cbind(Dataset,Data))
    
    dts <- split(Dataset, Dataset$Rows)
    dts <- lapply(dts, function(x) {
                t(x$Data)
            })
    > do.call("rbind", dts)
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
     [1,]    1    2    3    4    5    6    7    8    9
     [2,]   10   11   12   13   14   15   16   17   18
     [3,]   19   20   21   22   23   24   25   26   27
     [4,]   28   29   30   31   32   33   34   35   36
     [5,]   37   38   39   40   41   42   43   44   45
     [6,]   46   47   48   49   50   51   52   53   54
     [7,]   55   56   57   58   59   60   61   62   63
     [8,]   64   65   66   67   68   69   70   71   72
     [9,]   73   74   75   76   77   78   79   80   81
    

    【讨论】:

      【解决方案4】:

      我不确定这是否是您想要的,但从您的示例来看,它似乎可以解决问题。您实际上不需要行号和列号,只需要数据:

      matrix(Data, nrow=9, ncol=9, byrow=T)
      

      【讨论】:

      • 哈哈,我好像来晚了——这个答案在我打字/检查的时候被提出了两次。
      猜你喜欢
      • 2020-01-22
      • 2021-07-19
      • 1970-01-01
      • 2022-01-01
      • 2011-12-03
      • 1970-01-01
      • 2022-12-10
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多