免费注册 查看新帖 |

Chinaunix

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

用perl实现不同组别数据的提取 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-07-23 22:45 |只看该作者 |倒序浏览
原始数据如图所示目的:想把不同的组别中的数据分别提取出来(分成A/B/C三组),并计算每组中的每个变量(var1-var10)的平均值
结果输出如图
请各位大神指教



QQ截图20170723224151.png (10.02 KB, 下载次数: 50)

原始数据

原始数据

222.png (2.63 KB, 下载次数: 59)

最终输出

最终输出

论坛徽章:
0
2 [报告]
发表于 2017-08-05 13:37 |只看该作者
各位怎么都不回答呢?
还是贴一个大神的代码吧!
  1. #!/usr/bin/perl
  2. use strict;

  3. @ARGV != 1 || die "require 2 parameters";
  4. my ($groupfile, $relafile) = @ARGV;
  5. my(@temp1, %group, $toptable, @names, @data, @array);
  6. open GROUP, "<", $groupfile;

  7. while(<GROUP>){
  8.     chomp;
  9.     @temp1 = split "\t"; $_;
  10.     $group{$temp1[0]} = $temp1[1];
  11.     push @array, $temp1[1];       
  12. }
  13. print "id" . "\t";
  14. foreach my $i (0..$#array){
  15.     print  $array[$i] . "_ave" . "\t" . $array[$i] . "_std\t" if $array[$i] ne $array[$i+1];
  16.    next;
  17.         }
  18. print "\n";

  19. open IN, "<", $relafile;
  20. chomp ($toptable = <IN>);
  21. @names = split "\t", $toptable;

  22. while(<IN>){
  23.     chomp;
  24.     @data = split "\t";
  25.     my %hash1;
  26.     foreach my $index (1..$#data) {
  27.         my $key = $group{$names[$index]};
  28.         if ($hash1{$key}){
  29.             push @{$hash1{$key}}, $data[$index];
  30.         }else {
  31.             $hash1{$key} = [$data[$index]];
  32.         }
  33.     }
  34.     print $data[0] . "\t";
  35.     foreach my $elen ( sort keys %hash1) {
  36.         print average(@{$hash1{$elen}}) . "\t" . std(@{$hash1{$elen}}) . "\t";
  37.     }
  38.     print "\n"
复制代码


论坛徽章:
0
3 [报告]
发表于 2017-08-07 17:02 |只看该作者
这个excel不到一分钟就搞定了,为啥要麻烦写个脚本

论坛徽章:
0
4 [报告]
发表于 2017-08-07 20:45 |只看该作者
回复 3# hxswdl

问得好,,作为生信人,这个问题我竟一时不知如何回答

论坛徽章:
0
5 [报告]
发表于 2017-08-07 23:08 |只看该作者
这种问题用R来写的话10行内搞定

  1. library(reshape2)
  2. library(dplyr)

  3. data <- read.csv("in.csv")
  4. data_melt <- melt(data)
  5. data_melt$series <- substr(as.character(data_melt$variable), 1, 1)
  6. data_mean <- data_melt %>% group_by(id, series) %>% summarise_at("value", mean)
  7. data_rslt <- dcast(data_mean, id ~ series)
  8. write.csv(data_rslt, "out.csv")
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP