2015-04-27 4 views
2

В РИ хотим сделать следующее:R: Подменю на основе наложения нескольких файлов

У меня есть gene.list с 5 dataframes, где каждый dataframe выглядит следующим образом:

col1 
name1 
name2 
name3 
... 

Во-первых, я хотите извлечь перекрытие этих пяти кадров данных. Выход должен быть новым фреймворком данных: output

У меня есть еще один список, который называется coverage.list с 11 кадрами данных. Каждый dataframe выглядит следующим образом

col1  col2 col3 
name1-a 1  2 
name2-c 3  4 
name3-d 5  6 
name4-e 7  8 

Теперь от каждого dataframe в coverage.list, я хочу, чтобы извлечь строки, где значение col1 начинается с значением, присутствующим в новом выходном dataframe, созданном на предыдущем шаге. Вывод должен быть новый список под названием coverage.new.list

первый шаг: извлечение перекрытия 5 dataframes, я пытался использовать

Reduce(intersect, coverage.list)) 

Но я получаю как сообщение «кадр данных с 0 столбцами и 0 строками '. Однако, когда я использую функцию venn в этом списке, я получаю правильные совпадения

Не могли бы вы указать мне правильное решение?

+0

Если вы говорите о перекрытии, вы имеете в виду строки с одинаковым значением? Ваш dataframe - это всего лишь один столбец? – Molx

+0

действительно, строки с одинаковым значением. и действительно, все dataframes из списка coverage.list являются всего лишь одним столбцом – user1987607

ответ

1

Я думаю, что это то, что вы ищете

library(dplyr) 
library(tidyr) 

# Inner join on the gene.list tables. Inner join gene.list[[1]] with gene.list[[2]] then 
# inner join the result with gene.list[[3]] then inner join 
# then inner join with gene.list[[4]] then with gene.list[[5]] 

output <- inner_join(gene.list[[1]], gene.list[[2]]) %>% inner_join(gene.list[[3]]) %>% 
    inner_join(gene.list[[4]]) %>% inner_join(gene.list[[5]]) 

coverage.list.new <- lapply(coverage.list, function(x) {x %>% mutate(backup=col1) %>% 
    separate(col1, c("col1", "col1_2"), sep="-") %>% filter(col1 %in% output$col1) %>% 
    mutate(col1=backup) %>% select(-c(backup, col1_2))}) 

Update

coverage.list.new <- lapply(coverage.list, function(x) {x %>% 
    mutate(backup=col1, col1=sub("-", "@", col1)) %>% 
    separate(col1, c("col1", "col1_2"), sep="@") %>% filter(col1 %in% output$col1) %>% 
    mutate(col1=backup) %>% select(-c(backup, col1_2))}) 
# with col1=sub("-", "@", col1) in mutate i am substituting the first - with @ 
# in order to then split col1 by the @. If you have @ in your col1 to begin with 
# then choose a symbol that does not exist in your col1 and replace 
# in the code above the @ symbol with your chosen symbol. 

Примеры данных

gene.list <- list(data.frame(col1=c("name1", "name2", "name3")), 
       data.frame(col1=c("name1", "name3", "name4")), 
       data.frame(col1=c("name1", "name3", "name4")), 
       data.frame(col1=c("name1", "name3", "name4")), 
       data.frame(col1=c("name1", "name3", "name4"))) 

coverage.list <- list(data.frame(col1=c("name1-a", "name2-c", "name3-d", "name4-e"), 
          col2=c(1, 3, 5, 7), col3=c(2, 4, 6, 8)), 
        data.frame(col1=c("name3-a", "name4-c", "name3-d", "name4-e"), 
          col2=c(1, 3, 5, 7), col3=c(2, 4, 6, 8))) 
+0

Хороший вопрос, я должен был указать. Здесь есть хорошая статья: http://www.r-statistics.com/2014/08/simpler-r-coding-with-pipes-the-present-and-future-of-the-magrittr-package/ –

+0

backup = col1: это col1 из cover.list? – user1987607

+1

'%>%' называется трубой или цепочкой. в коде выше этот 'inner_join (x, y)%>% inner_join (z)' эквивалентен 'inner_join (inner_join (x, y), z)' –

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