2015-09-25 4 views
2

У меня есть несколько файлов, которые выглядят следующим образом:Слияние файлов с различными номерами строк

FILE1:

rsRNA-2312-n  2 
rsRNA-6508-n  2 
rsRNA-6382-n 10 
rsRNA-951-n  0 
rsRNA-6330-n  4 
rsRNA-6330-n 11 
rsRNA-1385-n  3 
rsRNA-4945-n  0 
rsRNA-946-n  9 

file2:

rsRNA-552-n  2 
rsRNA-5301-n  7 
rsRNA-6487-n  0 
rsRNA-4945-n  7 
rsRNA-2445-n  9 
rsRNA-6490-n  2 

file3:

rsRNA-4946-n  1 
rsRNA-5058-n  0 
rsRNA-552-n  0 
rsRNA-849-n  2 
rsRNA-3302-n  2 
rsRNA-4099-n  0 
rsRNA-552-n  1 

I хотел бы объединить файлы, создающие выходной файл th at имеет значения для каждого входного файла в отдельном столбце и уникальный идентификатор (столбец 1 во входном файле) в столбце 1. Если идентификатор не найден в определенном входном файле, для этого идентификатора для этого конкретного ввода счетчик должен быть 0.

выход, как (не реальные данные):

identifier file1 file2 file3 
rsRNA-552-n  2  4  5 
rsRNA-5301-n  7  12  2 
rsRNA-6487-n  0  1  5 
rsRNA-4945-n  7  12  1 
rsRNA-2445-n  9  4  55 
rsRNA-6490-n  2  1  0 

пытается:

files <- list.files(path = "./bowtie_mapped/", pattern='rsRNA_N1_grep_cut_cutN1_grep_cut_N1_grep2_N1_grep_N1*') 

merged.data.frame = Reduce(function(...) merge(..., all=T), files) 

и:

do.call(rbind, lapply(files, 
         function(f) { 
         cbind(read.csv(f), file_name=f) 
         })) 
+0

ли rownames уникального в каждом файл? – Heroka

+0

Некоторые row.names встречаются в более чем одном файле – user2300940

+0

Я имел в виду, могут ли они встречаться более одного раза в одном файле, извините. – Heroka

ответ

3

Если имена встречаются только один раз в файле, вы делаете следующие:

library(data.table) 
# make a list of filenames 
file.list <- list.files(path = "./bowtie_mapped/", pattern='rsRNA*') 
# read all the files 
df.list <- lapply(file.list, read.csv) 
dt <- rbindlist(df.list, idcol = "id") 

dtnew <- dcast(dt, V1 ~ id, value.var = "V2", fun.aggregate = sum, fill = 0) 

это приводит:

   V1 1 2 3 
1: rsRNA-1385-n 3 0 0 
2: rsRNA-2312-n 2 0 0 
3: rsRNA-2445-n 0 9 0 
4: rsRNA-3302-n 0 0 2 
5: rsRNA-4099-n 0 0 0 
6: rsRNA-4945-n 0 7 0 
7: rsRNA-4946-n 0 0 1 
8: rsRNA-5058-n 0 0 0 
9: rsRNA-5301-n 0 7 0 
10: rsRNA-552-n 0 2 1 
11: rsRNA-6330-n 15 0 0 
12: rsRNA-6382-n 10 0 0 
13: rsRNA-6487-n 0 0 0 
14: rsRNA-6490-n 0 2 0 
15: rsRNA-6508-n 2 0 0 
16: rsRNA-849-n 0 0 2 
17: rsRNA-946-n 9 0 0 
18: rsRNA-951-n 0 0 0 

Тот же результат может быть достигнут с помощью комбинации dplyr/tidyr:

library(dplyr) 
library(tidyr) 
dfnew <- bind_rows(file.list, .id = "id") %>% 
    group_by(id, V1) %>% 
    summarise(V2=sum(V2)) %>% 
    spread(id, V2, fill=0) 
+0

Что делать, если у меня 96 входов? – user2300940

+0

@ user2300940 вы также можете создать список с 'list.files()' – Jaap

+0

Ошибка в rbindlist (file.list, idcol = "id"): неиспользуемый аргумент (idcol = "id") – user2300940

1

Вот решение для вас, что предварительно обработать данные.

Вы можете использовать Reduce/слияния-решение, которое вы уже нашли с предварительной обработкой данных

Использование слияния:

alldata <- lapply(files, function(x){ 
    #read in data 
    data <- read.table(text=x,header=F,stringsAsFactors=F) 
    #aggregate data 
    data2 <- dcast(V1~"value",value.var="V2",fun.agg=sum,data=data) 
    return(data2) 
}) 

res <- Reduce(function(x,y) merge(x,y, by="V1",all=TRUE), alldata) 

Если вы хотите получить больше контроля о том, где пришли некоторые значения из, вас также может использовать reshape с идентификатором файла. Обратите внимание, что в решении слияния я повторил более файлов, здесь я перебираю имена файлов.

#create a long dataframe including an origin 
alldata <- do.call(rbind,lapply(names(files), function(x){ 
    #read in data 
    data <- read.table(text=files[[x]],header=F,stringsAsFactors=F) 
    #aggregate data 
    data2 <- dcast(V1~"value",value.var="V2",fun.agg=sum,data=data) 
    data2$origin <- x 
    return(data2) 
}) 
) 

res <- dcast(V1~origin,value.var="value",data=alldata) 

данные: список текстовых строк

files <- structure(list(file1 = "rsRNA-2312-n  2\nrsRNA-6508-n  2\nrsRNA-6382-n 10\nrsRNA-951-n  0\nrsRNA-6330-n  4\nrsRNA-6330-n 11\nrsRNA-1385-n  3\nrsRNA-4945-n  0\nrsRNA-946-n  9", 
    file2 = "rsRNA-552-n  2\nrsRNA-5301-n  7\nrsRNA-6487-n  0\nrsRNA-4945-n  7\nrsRNA-2445-n  9\nrsRNA-6490-n  2", 
    file3 = "rsRNA-4946-n  1\nrsRNA-5058-n  0\nrsRNA-552-n  0\nrsRNA-849-n  2\nrsRNA-3302-n  2\nrsRNA-4099-n  0\nrsRNA-552-n  1"), .Names = c("file1", 
"file2", "file3")) 
+0

Ошибка: value.var (V2) не найден во входных данных – user2300940

+1

[Вы уже приняли ответ, поэтому на самом деле не нужен, но для ясности]. Мое решение работает на моей машине с данными в текущем формате. Если в исходных данных есть заголовки, вы должны соответствующим образом отредактировать код. Поскольку они не приведены в данном примере, я не включил их. – Heroka

Смежные вопросы