2013-09-09 3 views
6

У меня 2 dataframes:Intersect dataframe на несколько столбцов

DAT: 1900 набл из 9 переменных

   V1  V2  V3  V4 V5  V6  V7  V8    V9 
1  V_P50P50_Q3 chr12 106642383 106642395 + 18.1425 4.03e-08 0.0515 GGGGGACTCCCCC 
2 V_P50RELAP65_Q5_01 chr8 142276666 142276677 - 16.6429 2.51e-07 0.2780 GGGATTTCCCAC 
3   V_RELA_Q6 chr22 51020067 51020078 - 15.9395 2.71e-07 0.3350 GGGAATTTCCCC 
4  V_NFKB_Q6_01 chr14 98601454 98601469 + 17.0684 3.08e-07 0.236 GGAGTGGAAATTCC 
5   V_CREL_Q6 chr22 51020068 51020079 - 16.1165 3.19e-07 0.4050 AGGGAATTTCCC 

dat.markov: 1486 набл из 9 переменных

  V1 V2  V3  V4 V5  V6  V7 V8    V9 
1 V_NFKB_Q6_01 chr14 98601454 98601469 + 17.2212 1.33e-07 0.146 GGAGTGGAAATTCCCT 
2 V_P50P50_Q3 chr12 106642383 106642395 + 16.9358 1.57e-07 0.201 GGGGGACTCCCCC 
3 V_CREL_Q6 chr22 51020068 51020079 - 16.0549 2.29e-07 0.292  AGGGAATTTCCC 
4 V_NFKB_Q6_01 chr22 51020064 51020079 + 16.9906 2.32e-07 0.146 TTGGGGGAAATTCCCT 
5 V_RELA_Q6 chr22 51020067 51020078 - 15.7496 3.42e-07 0.433  GGGAATTTCCCC 

мне нужно объединить два кадра данных, чтобы я получал все строки с соответствующими столбцами V1, V2, V3 и V4 между двумя кадрами данных.

Я пробовал:

y<-merge(dat,dat.markov,by=c("V1","V2","V3","V4")) 

, который дает мне слитый dataframe, но с 1513 набл. Но технически число наблюдений должно быть равно или меньше, чем меньший информационный кадр, то есть 1486 об.

Мои слиты data.frame выглядит хорошо с точки зрения количества столбцов, возвращаемых:

  V1 V2  V3  V4 V5.x V6.x  V7.x V8.x  V9.x V5.y  
1 V_CREL_01 chr10 112778464 112778473 + 12.9434 1.94e-05 0.694 TGGGTTTTCC + 
    V6.y  V7.y V8.y  V9.y 
1 12.8838 2.35e-05 0.788 TGGGTTTTCC 

Я знаю, что вы можете пересекать data.frames используя один столбец, но есть способ, в котором вы можете пересечь две данные .frames на нескольких столбцах?

+1

Вы делаете это правильно, однако, если у вас есть строки, где сочетание этих трех колонок не является уникальным, вы можете иметь очень большой результат! например 'merge (data.frame (X = rep (1: 4, 2), Y1 = ПИСЬМА [1: 4]), data.frame (X = 1: 3, Y2 = буквы [1: 3]))' где результат длиннее второго. – Justin

+0

Я думаю, что вы правы, я только что проверил, и в моем объединенном фреймворке есть много дубликатов. Поэтому в зависимости от данных мой код будет работать. Благодаря! –

ответ

2

Если я понимаю, вы хотите, чтобы столбцы 1,2,3,4 были идеально подобраны в обоих кадрах, чтобы сохранить их? Кроме merge, я использовал бы interaction и match функции

dat$combine = as.character(interaction(dat$V1, dat$V2, dat$V3, dat$V4)) 
dat.markov$combine = as.character(interaction(dat.markov$V1, dat.markov$V2, dat.markov$V3, dat.markov$V4)) 

dat.overlap = dat[complete.cases(match(dat.markov$combine, dat$combine)),] 
+0

Это не приводит к добавлению дополнительных столбцов, содержащихся в 'dat.markov', в результирующий' dat.overlap', как 'merge'. – Justin

+0

true. вы могли бы объединить эту последнюю строку с аналогичным вызовом dat.markov и перевернуть аргументы 'match', а затем указать столбцы, которые вы хотите. правда, хотя «слияние», а затем «уникальное» в переменной типа ID - это путь. – dylanjf

+0

@dylanjf: У меня действительно проблемы с памятью с функцией 'взаимодействия'. R просто зависает, когда я пытаюсь его использовать, поэтому мне просто придется объединить мои данные. Я попробовал «уникальный» ранее, но я не думаю, что могу использовать его, потому что хотя столбцы V1, V2, V3 и V4 одинаковы, соответствующие столбцы не уникальны. –

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