2017-08-08 47 views
0

这是R中的一个简单任务,但看起来我有一个误解。任何帮助澄清表示赞赏:转置并连接R data.tables

我有一个单一的文本文件的下列R- data.table:

dat = as.data.table(fread(...)) 

     type   proportion                                                                                
    1: type_3  0.5570502431                                                                                 
    2: type_5  0.1108589951                                                                                 
    3: type_1  0.0688816856                                                                                 
    4: type_9  0.0601296596                                                                                 
    5: type_8  0.0554294976                                                                                 
    6: type_12  0.0450567261                                                                                 
    7: type_2  0.0322528363                                                                                 
    8: type_4  0.0202593193                                                                                 
    9: type_7  0.0166936791                                                                                 
10: type_6  0.0145867099                                                                                 
11: type_10  0.0141004862                                                                                 
12: type_11  0.0040518639  

还有约。这些文本文件中有500个,我可以将其作为R data.table读入并放入R列表中。原则上这很简单:

list_of_data.tables = list(dat1, dat2, dat3, ...) 

concat = do.call("rbind", list_of_data.tables) 

这不是我想要的格式。我想利用列type作为最终级联data.table的报头,type_1type_2type_3等。然后,最终的级联data.table的每一行是列porportiondat1

下面是最终级联data.table的格式:

 type_1 type_2 type_3 type_4 type_5 type_6 ... 
dat1 0.557 0.110 0.068 0.0601 0.0554 0.045 ... 
dat2 0.23 0.324 0.12 0.0723 0.002 0.004 ... 
... 

我首先想到的是用t()移调原来data.table,但是这并没有使type头。此外,我不知道如何通过dat1等标签每行。

什么是做这种简单的事情的正确方法?

+1

旁注它们绑定:'fread'解释说它返回一个data.table,不需要强制。另外,'?rbind'解释说你可以使用'rbindlist'而不是'do.call'。 – Frank

+1

谢谢你,我不知道这个! – ShanZhengYang

回答

1

对于每个需要spread数据

library(tidyr) 
new.dat <- dat %>% 
      spread(type, proportion) 

然后你list_of_new.dat,假设它们在列表dat,你可以用

Reduce("full_join", list_of_new.dat) 
+0

你使用的库是'dplyr',对吗? – ShanZhengYang

+0

'tidyr' ...我原本也想用'map'动词,但是因为我没有,所以只能用'tidyr'。我编辑了我的答案。但我不确定'%>%'来自哪里......也许'dplyr'? – CPak

+0

我想我必须为每个'dat1','dat2'等创建一个新的列。 – ShanZhengYang