根据一列

时间:2015-09-17 20:55:07

标签: r

我有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合并文件。有什么帮助吗?感谢。

1 个答案:

答案 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

仅当您要合并的列具有相同的名称和数据类型时才能正常工作。