记一次和室友的讨论

充分应用了我目前所掌握的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个样本,左边的不止三列,把代码改下又可以使用。室友的方法还是有些繁琐,给我演示的时候,点了很多键。

实用性就更不用说了,身边的很多人都习惯性的采用最上面那张表的形式来做表格,我也是这样。以后应该有用处。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180403G024YZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券