【问题标题】:Transpose and rearrange rows in a matrix转置和重新排列矩阵中的行
【发布时间】:2016-03-25 01:30:36
【问题描述】:

我有几个具有以下结构的文件:

data <- matrix(c(1:100000), nrow=1000, ncol=100)

前 500 行是 X 坐标,最后 500 行是几个对象轮廓的 Y 坐标。第 1 行 (X) 和第 501 行 (Y) 对应于同一对象的坐标。我需要:

  • 转置整个矩阵并排列它,现在第 1 行是第 1 列,第 501 行是第 2 列,并且在连续列中具有成对的 x、y 坐标。第 2 行和第 502 行应位于前一个对象数据下方的第 1 列和第 2 列中。
  • 理想情况下,有一个包含文件名信息的额外列。

谢谢。

【问题讨论】:

  • 展示一个小例子总是比展示一个大数据集更好,这样更容易测试。
  • 如果矩阵只是来自一个文件,文件名不会重复50000次吗?将文件名存储在单独的对象中,或将矩阵存储在列表中。

标签: r matrix


【解决方案1】:

怎么样

n <- 500
df <- data.frame(col1 = data[1:n, ],
                 col2 = data[(nrow(data) - 500):nrow(data), ],
                 fileinfo = "this is the name of the file...")

【讨论】:

  • 在发布之前测试您的解决方案怎么样?
【解决方案2】:

更简单的版本:

转置矩阵,然后使用列索引和子集创建一个向量:

mat <- matrix(1:100, nrow = 10)
mat2 <- t(mat)
cols <- unlist(lapply(1:(nrow(mat2)/2), function(i) c(i, i+nrow(mat2)/2)))
mat3 <- mat2[,cols]

然后将其设置为如下所示的数据框。


您可以将由nrow/2 分隔的行对子集化,将它们设为两列矩阵,然后将它们全部cbind

df <- as.data.frame(do.call(cbind, lapply(1:(nrow(mat)/2), function(i) {
  matrix(mat[c(i, nrow(mat)/2 + i),], ncol = 2, byrow = TRUE)
})))
df
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 fname
# 1   1  6  2  7  3  8  4  9  5  10     a
# 2  11 16 12 17 13 18 14 19 15  20     e
# 3  21 26 22 27 23 28 24 29 25  30     e
# 4  31 36 32 37 33 38 34 39 35  40     o
# 5  41 46 42 47 43 48 44 49 45  50     y
# 6  51 56 52 57 53 58 54 59 55  60     q
# 7  61 66 62 67 63 68 64 69 65  70     v
# 8  71 76 72 77 73 78 74 79 75  80     b
# 9  81 86 82 87 83 88 84 89 85  90     v
# 10 91 96 92 97 93 98 94 99 95 100     y

然后根据需要添加新列,因为它现在是一个数据框:

df$fname <- sample(letters, nrow(df), TRUE)

【讨论】:

  • 不要忘记将mat &lt;- matrix(1:100, nrow = 10)移到帖子顶部,否则您添加的代码将失败。
【解决方案3】:

试试大卫的回答,但是这样:

n <- 500
df <- data.frame(col1 = data[1:n, ],
                 col2 = data[(nrow(data) - (n-1)):nrow(data), ],
                 fileinfo = "this is the name of the file...")

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多