我有100个文件,每个文件都是这样的:
ID BYr Milk REL
183601 2010 -0.635262171151035 50
183603 2010 -1.15906865500681 50
183611 2010 -0.39135273818727 50
183616 2010 0.832853286113099 50
183619 2010 1.15141619232805 50
第1列(ID)引用动物ID,所有文件都有此列。第三列是感兴趣的特征。在这种情况下,产奶量或哺乳期长度等。 我想基于变量ID合并所有文件,排除第2列和第4列,并生成包含所有ID和列中每个特征的文件。像这样:
ID Milk LactLength OP
183601 -0.635262171151035 350 2
183603 -1.15906865500681 250 4
183611 -0.39135273818727 450 5
183616 0.832853286113099 180 6
183619 1.15141619232805 250 7
183623 2.23473028006734 245 8
我从别人的回答中试过这个:
myfiles = list.files(pattern = "\\.txt$")
datlist <- lapply(myfiles,read.table, header = TRUE, stringsAsFactors = FALSE, colClasses=c("character", "NULL"))
rowseq <- seq_len( max(vapply(datlist,nrow, integer(1))) )
keylist <- lapply(datlist,function(x) { x[[3]][rowseq] })
names(keylist) <- myfiles
df = do.call(data.frame,keylist)
但我没有得到如何基于ID合并文件。有什么帮助吗?感谢。
答案 0 :(得分:1)
你可以在R中的'plyr'或'base'包中使用连接或合并函数。但是我更喜欢使用'dplyr'包,它有一些不同类型的方式来连接数据帧,比如left_join,inner_join等.I猜你的情况下你可以做一个full_join,然后省略你不想使用的列,如下所示:
require('dplyr')
first = TRUE
for (file in list.files(pattern = "\\.txt$")){ #loop over all txt files
if (first == T){df <- read.table(file,header=T)[,c(-2,-4)];first=FALSE} #don't need to join first file
else{full_join(df,read.table(file,header=T)[,c(-2,-4)])}} #join the former and the current dataframes
仅当您要合并的列具有相同的名称和数据类型时才能正常工作。