【问题标题】:Alternate, interweave or interlace two matrices交替、交织或交错两个矩阵
【发布时间】:2016-04-02 20:30:24
【问题描述】:

我有两个矩阵,我想以交替的方式交织/交错/交替堆叠/rbind。

ranks=1:3
names=c("Karl", "Klaus", "Mary")
x <- cbind(ranks, names)

universities=c("Cape Town", "London", "Berlin")
y <- cbind(rep("", 3), universities)

一排x之后,我想要一排y

     [,1] [,2]       
[1,] "1"  "Karl"     
[2,] ""   "Cape Town"
[3,] "2"  "Klaus"      
[4,] ""   "London"   
[5,] "3"  "Mary"   
[6,] ""   "Berlin" 

我试过matrix(rbind(x, y), ncol=2)(如果我有两个字符串似乎可以解决问题)没有效果

【问题讨论】:

  • matrix(rbind(t(x), t(y)), ncol=2, byrow=TRUE)
  • 转置!好点子。想要将您的评论升级为答案?
  • 请随意写出来
  • 嗯,这不是预期的方式......
  • 不言自明,但你为什么要这样做?第 2 列现在将有两种不同类型的数据,但没有说明它是什么类型的变量——只是假设模式总是“姓名,大学”。我们必须以“x”和“y”开头吗?

标签: r matrix alternating


【解决方案1】:

这里有两种选择。

首先,假设我们必须以“x”和“y”开头,您可以尝试“gdata”包中的interleave

library(gdata)
interleave(x, y)
#      ranks names      
# [1,] "1"   "Karl"     
# [2,] ""    "Cape Town"
# [3,] "2"   "Klaus"    
# [4,] ""    "London"   
# [5,] "3"   "Mary"     
# [6,] ""    "Berlin"

其次,假设我们可以从“ranks”、“names”和“universities”开始,您可以使用 base R,如下所示:

cbind(c(t(cbind(ranks, ""))), c(t(cbind(names, universities))))
#      [,1] [,2]       
# [1,] "1"  "Karl"     
# [2,] ""   "Cape Town"
# [3,] "2"  "Klaus"    
# [4,] ""   "London"   
# [5,] "3"  "Mary"     
# [6,] ""   "Berlin"

然而,更好的选择是使用melt 之类的东西(来自“reshape2”或“data.table”)。这将允许您添加另一个变量来指示值所代表的测量类型。

library(data.table)
melt(data.table(ranks, names, universities), "ranks")
#    ranks     variable     value
# 1:     1        names      Karl
# 2:     2        names     Klaus
# 3:     3        names      Mary
# 4:     1 universities Cape Town
# 5:     2 universities    London
# 6:     3 universities    Berlin

或者,匹配您想要的顺序:

library(data.table)
setorder(melt(data.table(ranks, names, universities), "ranks"), ranks)[]
#    ranks     variable     value
# 1:     1        names      Karl
# 2:     1 universities Cape Town
# 3:     2        names     Klaus
# 4:     2 universities    London
# 5:     3        names      Mary
# 6:     3 universities    Berlin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2019-07-03
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多