我有一个包含三列的数据帧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
答案 0 :(得分:0)
如果“目标”列中已存在所有表达式,则可以执行以下操作。 与您提供的图片的列名相对应:
library("reshape2")
the_list2 <- dcast(the_list,target~origin,value.var="value")
但我不知道如果原始数据框变大,它需要多长时间。
答案 1 :(得分:0)
您可以使用dplyr
和tidyr
执行此操作,但如果您的数据与您所描述的数据完全不同,则可能会遇到一些问题。
首先让我们创建输入数据:
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
值,或者(就像我创建的那样)他们手动并将结果加入他们。
即使在大型数据集上,dplyr
和tidyr
也应该很快。