3

私は、いくつかの関連する統計(実際には他の多くの統計と記述列)を持つ「領域」と、それらの領域にある遺伝子のコンマ区切りのリストがある実験を行っています。このリストの数は可変であり、何も含まれていない可能性があります(「NA」)。

テーブルを「溶かす」にはどうすればよいですか。

  region_id  statistic      genelist
          1        2.5       A, B, C
          2        0.5    B, C, D, E
          3        3.2          <NA>
          4        0.1          E, F

遺伝子リストの遺伝子ごとに個別のエントリを持つ別のテーブルを作成するには?つまり

   region_id statistic gene
           1       2.5    A
           1       2.5    B
           1       2.5    C
           2       0.5    B
           2       0.5    C
           2       0.5    D
           2       0.5    E
           3       3.2 <NA>
           4       0.1    E
           4       0.1    F

R / plyrでこれを行う方法があると思いますが、方法がわかりません。前もって感謝します。

編集:

Rを使用すると、次のコードでこれらのおもちゃのベクトルを再作成できます。

a <- structure(list(region_id = 1:4, statistic = c(2.5, 0.5, 3.2, 
0.1), genelist = structure(c(1L, 2L, NA, 3L), .Label = c("A, B, C", 
"B, C, D, E", "E, F"), class = "factor")), .Names = c("region_id", 
"statistic", "genelist"), class = "data.frame", row.names = c(NA, 
-4L))

b <- structure(list(region_id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
4L, 4L), statistic = c(2.5, 2.5, 2.5, 0.5, 0.5, 0.5, 0.5, 3.2, 
0.1, 0.1), gene = structure(c(1L, 2L, 3L, 2L, 3L, 4L, 5L, NA, 
5L, 6L), .Label = c("A", "B", "C", "D", "E", "F"), class = "factor")), .Names = c("region_id", 
"statistic", "gene"), class = "data.frame", row.names = c(NA, 
-10L))
4

6 に答える 6

4

data.table時間、メモリ、コーディング効率のソリューション

library(data.table)
DT <- data.table(a)
DT[, list(statistic, 
          gene = unlist(strsplit(as.character(genelist), ', ' ))),
   by = list(region_id)]

または、data.tableバージョン>=1.8.2からのリストの適切フォーマットを使用できます。

DTL <- DT[, list(statistic, 
         gene = strsplit(as.character(genelist), ', ' )),
    by = list(region_id)]

DTL
##    region_id statistic    gene
## 1:         1       2.5   A,B,C
## 2:         2       0.5 B,C,D,E
## 3:         3       3.2      NA
## 4:         4       0.1     E,F

その場合geneはリストのリストです

DTL[region_id == 1,unlist(gene)]
## [1] "A" "B" "C"
DTL[region_id == 2,unlist(gene)]
## [1] "B" "C" "D" "E"
# or if the following is of interest
DTL[statistic < 2,unlist(gene)]
## [1] "B" "C" "D" "E" "E" "F"

于 2012-09-27T23:29:34.913 に答える
3

フィールドを分割してから、遺伝子を分割し、遺伝子ごとに1行を印刷するだけです。入力ファイルをperlスクリプトの引数として置き換え<DATA>て使用することにより、スクリプトでこれを試すことができます。<>perl script.pl input.txt

use strict;
use warnings;

while (<DATA>) {
    chomp;                                   # remove newline
    my ($reg, $stat, $gene) = split /\t/;    # split fields
    my @genes = split /,\s*/, $gene;         # split genes
    for (@genes) {
        local $\ = "\n";                 # adds newline to print
        print join "\t", $reg, $stat, $_;
    }
}

__DATA__
region_id   statistic   genelist
1   2.5 A, B, C
2   0.5 B, C, D, E
3   3.2 <NA>
4   0.1 E, F

出力:

region_id       statistic       genelist
1       2.5     A
1       2.5     B
1       2.5     C
2       0.5     B
2       0.5     C
2       0.5     D
2       0.5     E
3       3.2     <NA>
4       0.1     E
4       0.1     F
于 2012-09-27T20:28:11.103 に答える
2

それを行うにはいくつかの方法があります。この方法は機能しますが、もっと良い方法があるかもしれません...

library(stringr) # for str_split
join(subset(a, select=c("region_id", "statistic")), 
     ddply(a, .(region_id), summarise, gene=str_split(genelist, ",\\S*")[[1]]))

plyrとstringrをロードする必要があります。

ああ、これがより良い方法です:

ddply(a, .(region_id), 
      function(x) data.frame(gene=str_split(x$genelist, ",\\S*")[[1]], 
                             statistic=x$statistic))
于 2012-09-27T20:29:29.403 に答える
2

ライブラリなしでそれを行う方法は次のとおりです。

data<-cbind(region_id=1:4, statistic=c(2.5, 0.5, 3.2, 0.1), genelist=c("A, B, C", "B, C, D, E", NA, "E, F"))

do.call(rbind, 
        apply(data, 1, 
              function(r) do.call(expand.grid, 
                                  c(unlist(r[-3]), 
                                    strsplit(r[3], ", ")))))

出力:

      region_id statistic genelist
1          1       2.5        A
2          1       2.5        B
3          1       2.5        C
4          2       0.5        B
5          2       0.5        C
6          2       0.5        D
7          2       0.5        E
8          3       3.2     <NA>
9          4       0.1        E
10         4       0.1        F
于 2012-09-28T00:49:03.813 に答える
1

これが使用している別のワンライナーですplyr

ddply(a, .(region_id), transform, gene = str_split(genelist, ',')[[1]])
于 2012-09-28T14:47:17.247 に答える
0

Perlソリューション:

#!/usr/bin/perl
<>;
print "region_id\tstatistic\tgene\n";
while(<>) {
  chomp;
  my ($reg, $stat, $genes) = split /\s+/, $_, 3;
  foreach my $gene (split /,\s*/, $genes) {
     print "$reg\t$stat\t$gene\n";
  }
}

このスクリプトを介して元のファイルを出力ファイルにパイプするだけです。

現在、出力値はタブで区切られ、右フラッシュされていませんが、本当に必要な場合は修正できます。

于 2012-09-27T20:32:41.960 に答える