R将数据帧转换为带标签的矩阵

时间:2018-04-24 18:14:24

标签: r matrix

我有一个包含此数据的数据框。

# A tibble: 20 x 3
# Groups:   CpG, Group [20]
   CpG        Group  Range
   <fct>      <dbl>  <dbl>
 1 cg01003813    1. 0.971 
 2 cg01003813    2. 0.0917
 3 cg01003813    3. 0.0535
 4 cg01003813    4. 0.0627
 5 cg01003813    5. 0.0575
 6 cg26484667    1. 0.0768
 7 cg26484667    2. 0.104 
 8 cg26484667    3. 0.0735
 9 cg26484667    4. 0.0453
10 cg26484667    5. 0.139 
11 cg25296477    1. 0.0745
12 cg25296477    2. 0.130 
13 cg25296477    3. 0.0772
14 cg25296477    4. 0.131 
15 cg25296477    5. 0.0765
16 cg13176022    1. 0.0895
17 cg13176022    2. 0.0236
18 cg13176022    3. 0.0412
19 cg13176022    4. 0.0478
20 cg13176022    5. 0.0346

然后我展开了数据框,以便它看起来我希望矩阵看起来如何:

> tidyr::spread(test, Group, Range, fill = 0)
# A tibble: 4 x 6
# Groups:   CpG [4]
  CpG           `1`    `2`    `3`    `4`    `5`
  <fct>       <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 cg01003813 0.971  0.0917 0.0535 0.0627 0.0575
2 cg13176022 0.0895 0.0236 0.0412 0.0478 0.0346
3 cg25296477 0.0745 0.130  0.0772 0.131  0.0765
4 cg26484667 0.0768 0.104  0.0735 0.0453 0.1390

现在我被卡住了。我无法弄清楚如何将其转换为格式正确且带标签的矩阵。

我希望我的5个组作为列标题(就像它们一样)。我希望CpG作为行名(目前它们是第一列。 我只是想不出如何把它变成一个正确标记的矩阵。

感谢您的支持。

2 个答案:

答案 0 :(得分:1)

xtabs让您更接近您想要的内容:

set.seed(1)
(foo <- cbind(expand.grid(CpG=letters[1:4], Group=1:5), Range = runif(20)))
#>    CpG Group      Range
#> 1    a     1 0.26550866
#> 2    b     1 0.37212390
#> 3    c     1 0.57285336
#> 4    d     1 0.90820779
#> 5    a     2 0.20168193
#> 6    b     2 0.89838968
#> 7    c     2 0.94467527
#> 8    d     2 0.66079779
#> 9    a     3 0.62911404
#> 10   b     3 0.06178627
#> 11   c     3 0.20597457
#> 12   d     3 0.17655675
#> 13   a     4 0.68702285
#> 14   b     4 0.38410372
#> 15   c     4 0.76984142
#> 16   d     4 0.49769924
#> 17   a     5 0.71761851
#> 18   b     5 0.99190609
#> 19   c     5 0.38003518
#> 20   d     5 0.77744522

xtabs(Range ~ Group + CpG, foo)
#>      CpG
#> Group          a          b          c          d
#>     1 0.26550866 0.37212390 0.57285336 0.90820779
#>     2 0.20168193 0.89838968 0.94467527 0.66079779
#>     3 0.62911404 0.06178627 0.20597457 0.17655675
#>     4 0.68702285 0.38410372 0.76984142 0.49769924
#>     5 0.71761851 0.99190609 0.38003518 0.77744522

答案 1 :(得分:1)

只需将其转换为如下所示的矩阵

import re 
import timeit

def create_simple_regex(lookup):
  return re.compile(lookup)

def create_complex_regex(lookups):
  return re.compile('|'.join(lookups))  

def look_with_simple(lookups, word):
  return [create_simple_regex(lookup).findall(word) for lookup in lookups]

def look_with_complex(lookups, word):
  return create_complex_regex(lookups).findall(word)

lookups = list('abcdefghijklmnopqrstuvwxyz')
word = 'hello world!' * 1000

print(timeit.timeit('look_with_simple(lookups, word)', number=1000, globals=globals()))

print(timeit.timeit('look_with_complex(lookups, word)', number=1000, globals=globals()))