如何将较小矩阵中的数据添加到R中的大数据帧中

时间:2017-08-04 11:00:04

标签: r matrix dataframe

我有大量不同大小的矩阵。这是前6个,你可以看到大小为1x1的矩阵,但也可以看到大小为542x1191的矩阵

List of 627
 $ 1  : num [1, 1] 1
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr "94728_61406"
  .. ..$ : chr "6794602"
 $ 2  : num [1:2, 1:2] 1 0 0 1
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2] "132479_177215" "67496_29758"
  .. ..$ : chr [1:2] "1008667" "8009082"
 $ 3  : num [1, 1] 1
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr "132479_177215"
  .. ..$ : chr "6740421"
 $ 4  : num [1, 1] 1
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr "20825_2765"
  .. ..$ : chr "6777805"
 $ 5  : num [1:542, 1:1191] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:542] "100090_1753055" "100140_659556" "100173_597660" "100230_231297" ...
  .. ..$ : chr [1:1191] "1001682" "1001990" "1002541" "1002790" ...

我试图从这个不同大小的矩阵中获取数据,这些数据看起来像这样(为了简单起见,我重写了列名)

                       A       B       C       D
12760600_512333        1       1       0       0
132479_177215          0       0       1       0
84069228_2388656       0       0       0       1


                       A       B       C       D      E
12760600_512333        0       1       0       0      1
132479_177215          1       1       1       0      0
84069228_2388656       0       0       1       1      0

并将它们放入更大的data.frame,看起来像这样

    A   B   C   E   F   D   Q   Z   . . .
1   NA  NA  NA  NA  NA  NA  NA  NA
2   NA  NA  NA  NA  NA  NA  NA  NA
3   NA  NA  NA  NA  NA  NA  NA  NA
4   NA  NA  NA  NA  NA  NA  NA  NA
.
.
.

因此每个输入矩阵中的列名可以包含不同的列名,outpu数据框包含所有这些名称。

输出数据框应如下所示:

    A   B   C   E   F   D   Q   Z   . . .
1   1   1   0   NA  NA  0   NA  NA
2   0   0   1   NA  NA  0   NA  NA
3   0   0   0   NA  NA  1   NA  NA
4   NA  NA  NA  NA  NA  NA  NA  NA
5   0   1   0   1   NA  0   NA  NA 
6   1   1   1   0   NA  0   NA  NA
7   0   0   1   0   NA  1   NA  NA 
.
.
.

我尝试了循环,我尝试识别相同的colnames然后将值放在此列和适当的行中但是它需要花费很多时间,因为我有许多大小为500x1100且更大且输出data.frame的矩阵超过50.000列。我希望输出是data.frame,因为我不知道我应该在矩阵中使用多少行,因为输入矩阵在627个元素的大列表中,每个矩阵有不同的行数,所以要得到完整的数量我不得不另外制作一个我不想要的循环。

这是我尝试的代码(仅用于列表中的一个矩阵,对于每个矩阵,还有一个用于循环):

dataframe <- as.data.frame(matrix(ncol = nlevels(data1$SKU)))
colnames(dataframe) <- levels(data1$SKU)

for (k in 1:nrow(matrix)){
  for (i in 1:ncol(matrix)){
    for (j in 1:ncol(dataframe)){
      if (colnames(matrix)[i] == colnames(matrix)[j]){
        matrix[k,j] <- dataframe[k,i]
      }
    }
  } 
}

注意:矩阵和数据框不是我的变量名称我知道矩阵也是函数。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用包data.table:

,这很容易且相对有效
Having

答案 1 :(得分:0)

如果你的意思是像sql外连接一样加入你应该使用合并这也在How to join (merge) data frames (inner, outer, left, right)?中描述

快速示例如下:

m1 <- matrix(data = c(1:5,1:5),ncol = 2)
m2 <- matrix(data = c(5:10,10:15),ncol = 2)
merge(m1,m2,all = TRUE)

,结果就像

   V1 V2
1   1  1
2   2  2
3   3  3
4   4  4
5   5  5
6   5 10
7   6 11
8   7 12
9   8 13
10  9 14
11 10 15