如何从稀疏数据帧构建紧凑矩阵?

时间:2016-08-12 09:20:07

标签: r matrix dataframe

我有一个包含三列的数据帧1st:origin interactor(org),2nd:interaction of interaction(rsq)3rd:target interactor(tgt),看起来像这样(例子)enter image description here,我想要将它转换为一个紧凑的矩阵,就像这个(例子)enter image description here,我正在使用的数据帧非常大,(36791个元素)为了做到这一点,我编写了以下内容:

the_list  <- data.frame(org,rsq,tgt)

a  <- length(org)
b  <- length(tgt)

str(the_list)
#output matrix
dm = matrix( nrow= a, ncol= b, dim = list(org, tgt))

for (i in 1:nrow(the_list)){ #iterate thorugh lines of input file
  
  dm[match(the_list[i,1],rownames(dm)), match(the_list[i,3],colnames(dm))] = the_list[i,2]
                                                      
}
dm
我真的很感谢你的支持,因为,正如你可能猜到的那样,我基本上没有经验。 非常感谢 阿尔弗雷

2 个答案:

答案 0 :(得分:0)

如果“目标”列中已存在所有表达式,则可以执行以下操作。 与您提供的图片的列名相对应:

library("reshape2")    
the_list2 <- dcast(the_list,target~origin,value.var="value")

但我不知道如果原始数据框变大,它需要多长时间。

答案 1 :(得分:0)

您可以使用dplyrtidyr执行此操作,但如果您的数据与您所描述的数据完全不同,则可能会遇到一些问题。

首先让我们创建输入数据:

library(dplyr)
library(tidyr)

start <- tibble(origin = c(rep("a", 9), rep("b", 8)),
                value = paste0("x", 1:17),
                target = c("a", "b", "c", "e", "f", "l", "z", "s", "n", "a",
                               "e", "f", "j", "k", "t", "l", "s"))

然后将其转换为类似于您正在寻找的内容:

end <- start %>% 
    spread(origin, value)

这将给出:

end

# A tibble: 12 x 3
   target     a     b
*   <chr> <chr> <chr>
1       a    x1   x10
2       b    x2  <NA>
3       c    x3  <NA>
4       e    x4   x11
5       f    x5   x12
6       j  <NA>   x13
7       k  <NA>   x14
8       l    x6   x16
9       n    x9  <NA>
10      s    x8   x17
11      t  <NA>   x15
12      z    x7  <NA>

根据您的原始问题,由于新的target列缺少某些值(例如d和&#39; g&#39;),因此您并非如此。加上其他)。

由于没有您自己的任何实际数据,我能做的最好的事情就是手动创建那些缺失的行(在您的情况下就足够简单,因为它们只是字母)

tibble(target = letters) %>% 
    left_join(end)

# A tibble: 26 x 3
   target     a     b
    <chr> <chr> <chr>
1       a    x1   x10
2       b    x2  <NA>
3       c    x3  <NA>
4       d  <NA>  <NA>
5       e    x4   x11
6       f    x5   x12
7       g  <NA>  <NA>
8       h  <NA>  <NA>
9       i  <NA>  <NA>
10      j  <NA>   x13
# ... with 16 more rows

对于您的实际数据,您需要确保您的起始数据包含您感兴趣的所有target值,或者(就像我创建的那样)他们手动并将结果加入他们。

即使在大型数据集上,dplyrtidyr也应该很快。