充分应用了我目前所掌握的perl编程技巧和浅显的R知识,以及复习了一些文件传输知识(Windows和Linux文件互传,利用文件句柄输出文件,R读入Linux文件)。在和室友的这一次讨论中,自己尝试了多次才成功,最终的效果不错,比室友在Excel上操作快不少。他的Excel还是很厉害的,用的是宏,这一些Excel知识我是不太了解的。
事情的起因是,我这位什么都懂点的室友在中午1:30的时候突然抛给我一个问题:
(表1)
如何把上面这张表转换为下面这张
(表2)
他嫌复制—下拉—复制—转置太麻烦了,毕竟他的完整表格有四五百行。
下面的那张表格似曾相识,昨天学R的时候刚好学到了,应该是叫“tidy data原则”。于是我首先想到的是用R:
1.先把表1的左边两列单独处理,得到两个均为11行的表
biao1
biao2
(第二张也是这样)
2.再对表的右边12列进行处理,目的是得到tidy data.
>hqg_txt
>View(hqg_txt)
>hqg_txt_tidy1
>View(hqg_txt_tidy1)
按shoot、root排序之后的形式是我们想到的。但此时不确定之后左右拼接表格会不会受到前面序号的影响。
3.拼接表格
>biao3
>biao4
>View(biao4)
到这儿可以看出,拼接的时候序号还是默认了一致,所以尝试是失败的。另外还有一点,最上面那个测试表格只有两行,就需要写这么多操作,似乎也没有多省时,500行肯定累死。不过我相信R肯定有办法,只是我还没有学到位。
洗个澡的工夫,我突然想到perl也许可以解决问题。perl里面讲split的时候,说过可以按照特定的字符(如制表符\t)分隔字符串。基本算法就是,每一次读入一行记录,一一分开,左边三列配合换行符让其重复11次组成数组,右边11个元素一一加上换行符组成新的数组,这两个数组分别打印在两个文本文件(可以追加编辑)上,最后在R上将两个文本左右拼接就可以了。
------------------------------
#! /usr/bin/perl
use warnings;
$n = 0;
#@zuobiao = qw();
#@youbiao = qw();
#$zuobiaohang = "";
$filename = 'hqg_excel.txt';
my $file_fh = hqg_excel_fh;
open $file_fh, '
$outfilename1 = 'zuobiao.txt';
my $outfile_fh1 = zuobiao_fh;
open $outfile_fh1, '>', $outfilename1 or die;
$outfilename2 = 'youbiao.txt';
my $outfile_fh2 = youbiao_fh;
open $outfile_fh2, '>', $outfilename2 or die;
while () {
@zuobiao = qw();
@youbiao = qw();
$zuobiaohang = "";
$n = $n + 1;
chomp;
my @yihang = split /\t/, $_;
for ($i = 0;$i
$zuobiaohang = $zuobiaohang.$yihang[$i]."\t";
}
$zuobiaohang = $zuobiaohang.$yihang[2];
$zuobiaohang = $zuobiaohang."\n";
for ($j = 1; $j
push (@zuobiao,$zuobiaohang);
}
#print "this is zuobiao.\n";
foreach $quzhi (@zuobiao) {
print $outfile_fh1 $quzhi;
#print $quzhi;
}
for ($k = 3;$k
$youbiaohang = $yihang[$k]."\n";
push (@youbiao,$youbiaohang);
}
#print "this is youbiao.\n";
foreach $quvalue (@youbiao) {
print $outfile_fh2 $quvalue;
#print $quvalue;
}
}
print "there are $n lines on this table.";
#这里为了图简便,直接用了数据元素的个数来写循环,如果遇到有的行不是11个数据,就需要用函数来取数组的元素个数了。
------------------------------
写代码的过程是难熬的,写出来的时候是自豪的。
$ vi perltest.pl写到Linux上;$ perl perltest.pl运行,hqg_excel.txt里存的是测试数据,现在就可以看到两个文本文件了。(这里说一下,为了让室友检验我的程序,我又让他给我发了一个12行的数据,重写进了hqg_excel.txt)
再在R上面操作:
(只截取了一部分)
到这儿应该算是圆满完成了,不管几百行,只要是这个结构的数据都可以几个命令搞定,哪怕是不等于11个样本,左边的不止三列,把代码改下又可以使用。室友的方法还是有些繁琐,给我演示的时候,点了很多键。
实用性就更不用说了,身边的很多人都习惯性的采用最上面那张表的形式来做表格,我也是这样。以后应该有用处。
领取专属 10元无门槛券
私享最新 技术干货