2014-02-06 88 views
0

的我已经加载功能20个CSV文件:结合一些CSV文件合并成一个 - 列数不同

tbl = list.files(pattern="*.csv") 
for (i in 1:length(tbl)) assign(tbl[i], read.csv(tbl[i])) 

list_of_data = lapply(tbl, read.csv) 

那它的样子:

> head(tbl) 
[1] "F1.csv"   "F10_noS3.csv" "F11.csv"   "F12.csv"   "F12_noS7_S8.csv" 
[6] "F13.csv" 

我必须将所有这些文件合并为一个。让我们把它称为主文件,但让我们尝试使用所有名称创建一个表。 在所有这些csv文件中都有一个名为“Accession”的列。我想从所有这些csv文件中创建一个所有“名称”的表格。当然,许多种质可以在不同的csv文件中重复使用。我想保留与加入相应的所有数据。

一些问题:

  • 其中的一些“名”是一样的,我不想重复他们
  • 其中的一些“名字”几乎是相同的。不同之处在于名称和成为点和数字后。
  • 列数可以不同的是那些csv文件。

这显示屏幕截图这些数据看起来的样子: http://imageshack.com/a/img811/7103/29hg.jpg

让我告诉你它的外观:

AT3G26450.1 <-- 
AT5G44520.2 
AT4G24770.1 
AT2G37220.2 
AT3G02520.1 
AT5G05270.1 
AT1G32060.1 
AT3G52380.1 
AT2G43910.2 
AT2G19760.1 
AT3G26450.2 <-- 

<-- = 同一样品,不同的名称。应该被视为一个。所以在之后忽略点和一个数字。

可以吗?

我无法做dput(head),因为它的数据集太大了。

我试图用这样的代码:

all_data = do.call(rbind, list_of_data) 
Error in rbind(deparse.level, ...) : 
The number of columns is not correct. 


all_data$CleanedAccession = str_extract(all_data$Accession, "^[[:alnum:]]+") 
all_data = subset(all_data, !duplicated(CleanedAccession)) 

我试着做了将近2周,我不能。所以请帮助我。

回答

2

你的问题似乎包含多个子问题。我鼓励你将它们分开。

您明显需要的第一件事是将数据框与不同列组合。您可以使用rbind.fillplyr包:

library(plyr) 
all_data = do.call(rbind.fill, list_of_data) 
+2

'rbind.fill(list_of_data)'会更快,'dplyr :: rbind_all(list_of_data)'会更快呢。 – hadley

+0

都工作得很好,速度不够快。任何想法如何删除重复和“相同的名字”后点不同的数字。谢谢!任何建议我做错了应该downvote? – Rechlay

+0

非常有用的答案(和高效!)。非常感谢。 –