免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10050 | 回复: 42
打印 上一主题 下一主题

【问题】对N个相似文本进行计算分析?5000积分求解决~ [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-11 16:01 |只看该作者 |倒序浏览
30可用积分
本帖最后由 huang6894 于 2014-08-11 17:00 编辑

嗯,因为一些奇葩的需求,想请教一下各位大神~
某目录下有N个以下格式的文本:

1.txt:

  1. Region 1 : chr1 21 33
  2. 0 0 0 0 0 1 1 6 26 26 27 27 28
  3. Region 2 : chr1 73 108
  4. 2 2 2 2 2 3 3 3 3 6 7 7 7 7 7 7 7 7 7 7 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 21
  5. Region 3 : chr1 109 124
  6. 48 48 48 48 48 48 47 53 53 53 53 53 56 57 55 55
  7. Region 4 : chr1 21 33
  8. 32 44 44 44 44 46 47 47 47 47 47 54 61
  9. Region 5 : chr1 83 99
  10. 26 26 27 27 27 27 28 28 33 33 33 33 33 33 34 34 35
复制代码
2.txt:

  1. Region 1 : chr1 21 33
  2. 1 2 0 4 5 1 1 7 6 6 2 27 28
  3. Region 2 : chr1 73 108
  4. 12 2 2 22 2 23 3 13 13 6 7 7 71 7 6 7 7 7 7 4 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 21
  5. Region 3 : chr1 109 124
  6. 8 8 8 8 8 8 7 53 53 53 53 53 56 57 55 55
  7. Region 4 : chr1 21 33
  8. 2 44 4 4 4 6 7 7 7 7 7 4 1
  9. Region 5 : chr1 83 99
  10. 6 6 7 7 7 7 8 8 3 3 33 33 33 33 34 34 35
复制代码
他们的单行‘Region ****’都是一样的,但是双行(双行表示region行最后两个数字之间每个点的质量值)是不同的,我现在需要把这N个文件每个点的质量值取平均,每个点的质量值(P)都与这个平均值(Q)做比较,如果P值位于0~0.3Q之间,该点定义为flag1,如果P值位于0.3Q~0.6Q之间,定义改点为flag2,否则为flag3.(不会啊~)

最难的是:只有在一个区域(最少连续5个点)中有60%(3个)以上相同的flag时,认为该flag可信,输出这个区域和flag,如chr1 2-6  flag1
----------------------------------------------

编辑一下:举个例子:

-----------------------------
比如我们有4个文件都是题目的格式,然后:
在于Region 2 : chr1 73 108上,表示73到77这5bp的质量分别是:
1.txt:

1 1 1 1 1

2.txt:

2 2 2 2 2

3.txt:

3 3 3 3 3

4.txt:

4 4 4 4 4

-------------------------
那么每个点的平均质量值应该是:
2.5 2.5 2.5 2.5 2.5
--------------------------------------
那么对比条件:每个点的质量值(P)都与这个平均值(Q)做比较,如果P值位于0~0.3Q之间,该点定义为flag1,如果P值位于0.3Q~0.6Q之间,定义改点为flag2,否则为flag3.
----------------------------------------------------------------
应该是:
1.txt:

flag2 flag2 flag2 flag2 flag2


2.txt:

flag3 flag3 flag3 flag3 flag3

3.txt:

flag3 flag3 flag3 flag3 flag3

4.txt:

flag3 flag3 flag3 flag3 flag3
-------------------------------------
于是我们得到结果是:
1.txt    chr1  73-77  flag2
2.txt    chr1  73-77  flag3
3.txt    chr1  73-77  flag3
4.txt    chr1  73-77  flag3

---------------------------------------------------
上面举的例子是很特殊的,一般的例子可能是:

同样四个文本:
chr1 1-11
对比条件后是:
1.txt:

flag2 flag1 flag2 flag2 flag2  flag1  flag3  flag3  flag3   flag3  flag3  


2.txt:

flag3 flag3 flag3 flag2 flag2  flag2  flag2  flag3  flag3   flag3  flag3  #1-5:flag3===6-11:flag3(4-8:flag2 ?)===>优先判断为flag1,然后是flag2,最后才是flag3,也就是说我们需要首先认同4-8是flag2,然后再认为1-3是flag3,9-11是flag3

3.txt:

flag3 flag1 flag3 flag1 flag1  flag3  flag1  flag1  flag1   flag1  flag1  

4.txt:

flag3 flag3 flag3 flag3 flag3  flag3  flag3  flag3  flag3   flag3  flag3  
-------------------------------------
于是我们得到结果是:
1.txt    chr1  1-5  flag2
1.txt    chr1  6-11  flag3
2.txt    chr1  1-3  flag3
2.txt    chr1  4-8  flag2
2.txt    chr1  9-11  flag3
3.txt    chr1  1-11  flag1
3.txt    chr1  1-11  flag3
---------------------------------------------------
说实话,我一个人研究,估计一年也搞不出来。。。。只能跪求各位大神了。。。。。

最佳答案

查看完整内容

这个问题, 我不放弃 ~ {:2_172:}基本完成 ~ {:2_168:}[*]使用猫 (cat)[*]我不知道 flag 这个计算规则,所以我用我的规则[*] 在第 40 行有一个错误

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
2 [报告]
发表于 2014-08-11 16:01 |只看该作者
本帖最后由 pitonas 于 2014-08-16 05:32 编辑

这个问题, 我不放弃 ~ {:2_172:}
基本完成
~ {:2_168:}
  • 使用猫 (cat)
  • 我不知道 flag 这个计算规则,所以我用我的规则
  • 在第 40 行有一个错误
  1. #!/usr/bin/perl -w
  2. use 5.010;

  3. my @txt = qw/1.txt 2.txt/;          # glob or ...
  4. my @tmp = map { "$_.tmp" } @txt;    # tmp files
  5. my ( $fh, @fh ) = map { open my $f, '<', $_; $f } @txt;
  6. my @write_fh    = map { open my $f, '>', $_; $f } @tmp;
  7. my ( $CHR, $BEGIN );

  8. while (<$fh>) {
  9.     ( $CHR, $BEGIN ) = (split)[ 3, 4 ];
  10.     my @pos   = [ split /\s/, <$fh> ];
  11.     my $index = $#{ $pos[0] };

  12.     for my $f (@fh) {
  13.         readline $f;
  14.         push @pos, [ split /\s/, <$f> ];
  15.     }

  16.     my @ave = map {
  17.         my ( $i, $sum ) = $_;
  18.         $sum += $pos[$_][$i] for 0 .. $#pos;
  19.         $sum / @pos;
  20.     } 0 .. $#{ $pos[0] };

  21.     for my $i ( 0 .. $#pos ) {
  22.         my @flag = map {
  23.             my $F = $pos[$i][$_] / ( $ave[$_] || 1 );
  24.             [ $F = $F <= 0.3 ? 0 : $F > 0.6 ? 2 : 1, 1 ];
  25.         } 0 .. $index;

  26.         separate( $i, @flag );
  27.     }
  28. }

  29. sub separate {
  30.     my $index = shift;
  31.     my @flag = ( [], [], [] );

  32.     for my $f ( 1 .. 3 ) {
  33.         for ( my $i = 0 ; $i <= $#_ - 4 ; $i++ ) {
  34.             next if $_[$i][0] ne $f;
  35.             $i += 7 and next if !$_[ $i + 2 ][1];
  36.             my $end  = $i + 4;
  37.             my $zero = 0;
  38.             for my $x ( reverse $end - 1 .. $end ) {
  39.                 $_[$x][1] ? last : $zero++;
  40.             }

  41.             my $count = grep { $_[$_][0] == $f } $i .. $end - $zero;
  42.             next if $count < 3;
  43.             @{ $_[$_] } = ( $f, 0 ) for $i .. $end - $zero;
  44.             $i += 4 + $zero ? 5 - $zero : 0;
  45.         }
  46.     }

  47.     for my $i ( 0 .. $#_ ) {
  48.         !$flag[ $_[$i][0] ][0] || ( $i - $flag[ $_[$i][0] ][-1][-1] != 1 )
  49.           ? push @{ $flag[ $_[$i][0] ] }, [$i]
  50.           : ( $flag[ $_[$i][0] ][-1][1] = $i );
  51.     }
  52.     my $i;
  53.     for my $f (@flag) {
  54.         $i++;
  55.         for my $range (@$f) {
  56.             @$range <= 1 || $range->[1] - $range->[0] < 2 and next;
  57.             my $range = join '-', map { $_ + $BEGIN } @$range;
  58.             say { $write_fh[$index] } "$txt[$index]\t$CHR\t$range\tf$i";
  59.         }
  60.     }
  61. }

  62. close $_ for @write_fh;
  63. `cat @tmp > result.txt`;    # cat

  64. __DATA__
  65.     ~ 0.3
  66. 0.3 ~ 0.6
  67. 0.6 ~
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-08-11 16:18 |只看该作者
没看明白你说的具体意思, 能不能手工写一下你要的结果是什么样的?

另外, 你的双行数据这么多, 全是 质量 么? 有的还是一串0 ...

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2014-08-11 16:21 |只看该作者
my $师傅 jason680:
  1. 问题本不难,你又不举例,
  2. 描述又乱写,让人费疑猜?
复制代码
难的不是问题 ~ {:2_172:}
最难的是看懂问题 ~ {:2_168:}

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
5 [报告]
发表于 2014-08-11 16:24 |只看该作者
本帖最后由 xiumu2280 于 2014-08-11 16:27 编辑

生信的表示看懂了

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
6 [报告]
发表于 2014-08-11 16:31 |只看该作者
本帖最后由 xiumu2280 于 2014-08-11 16:31 编辑

他们的单行‘Region ****’都是一样的, #两行为一个单位,第一行相当于一个ID,chr1 21 33,表示在chr1上21到33的位置,下面第二行是对应在21到33位置上碱基的质量值也就是每个点的P值。
但是双行(双行表示region行最后两个数字之间每个点的质量值)是不同的,
我现在需要把这N个文件每个点的质量值取平均, #按照位置在多个文件内来个交叉求和再算平均值,这个平均值就是Q值。
每个点的质量值(P)都与这个平均值(Q)做比较, #即用P/Q
如果P值位于0~0.3Q之间,该点定义为flag1,如果P值位于0.3Q~0.6Q之间,定义改点为flag2,否则为flag3.(不会啊~)

最难的是:只有在连续5个点中有3个以上相同的flag时,认为该flag可信, #就是连续的5个位置中有3个以上在相同的flag区域,则输出该区域
输出这5个点的区域和flag,如chr1 2-6  flag1

我来帮你解释一下回复 3# pitonas


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [报告]
发表于 2014-08-11 16:32 |只看该作者
本帖最后由 huang6894 于 2014-08-11 16:39 编辑

@q1208c@pitonas两位大神,我很抱歉啊~
比如我们有4个文件都是题目的格式,然后:
在于Region 2 : chr1 73 108上,表示73到77这5bp的质量分别是:
1.txt:

1 1 1 1 1

2.txt:

2 2 2 2 2

3.txt:

3 3 3 3 3

4.txt:

4 4 4 4 4

-------------------------
那么每个点的平均质量值应该是:
2.5 2.5 2.5 2.5 2.5
--------------------------------------
那么对比条件:每个点的质量值(P)都与这个平均值(Q)做比较,如果P值位于0~0.3Q之间,该点定义为flag1,如果P值位于0.3Q~0.6Q之间,定义改点为flag2,否则为flag3.
----------------------------------------------------------------
应该是:
1.txt:

flag2 flag2 flag2 flag2 flag2


2.txt:

flag3 flag3 flag3 flag3 flag3

3.txt:

flag3 flag3 flag3 flag3 flag3

4.txt:

flag3 flag3 flag3 flag3 flag3
-------------------------------------
于是我们得到结果是:
1.txt    chr1  73-77  flag2
2.txt    chr1  73-77  flag3
3.txt    chr1  73-77  flag3
4.txt    chr1  73-77  flag3

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
8 [报告]
发表于 2014-08-11 16:34 |只看该作者
回复 5# xiumu2280


    xiumu2280大神我爱死你了~{:2_178:}

-----------------------
各位大神请原谅一个体育老师教语文的孩子~

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
9 [报告]
发表于 2014-08-11 16:35 |只看该作者
能看懂问题,我感到很开心 {:2_168:} 回复 7# huang6894


   

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
10 [报告]
发表于 2014-08-11 16:49 |只看该作者
想了一下,哈希切片简直就是为这个问题准备的·····
看看晚上帮你写下回复 7# huang6894


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP