2015-03-10 4 views
0

У меня есть некоторые данные в следующем формате:Все возможные уникальные комбинации R

Ind Letter Place Position 
1 A  19 23 
2 B  19 23 
3 B  19 23 
4 B  19 23 
1 B  19 34 
2 A  19 34 
3 B  19 34 
4 B  19 34 
1 C  19 52 
2 T  19 52 
3 C  19 52 
4 T  19 52 
1 T  33 15 
2 T  33 15 
3 T  33 15 
4 C  33 15 
1 C  33 26 
2 T  33 26 
3 T  33 26 
4 C  33 26 

dput данных:

structure(list(Ind = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Letter = structure(c(1L, 
2L, 2L, 2L, 2L, 1L, 2L, 2L, 3L, 4L, 3L, 4L, 4L, 4L, 4L, 3L, 3L, 
4L, 4L, 3L), .Label = c("A", "B", "C", "T"), class = "factor"), 
    Place = c(19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 
    19L, 19L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L), Position = c(23L, 
    23L, 23L, 23L, 34L, 34L, 34L, 34L, 52L, 52L, 52L, 52L, 15L, 
    15L, 15L, 15L, 26L, 26L, 26L, 26L)), .Names = c("Ind", "Letter", 
"Place", "Position"), class = "data.frame", row.names = c(NA, 
-20L)) 

мне нужно пару и объединить их, так что я получаю все возможные уникальные комбинации со ссылкой на позицию в паре. У меня есть еще один файл данных, который содержит информацию о парах, и они сопряжены со ссылкой на Place. Так что в этом файле я мог видеть, что место 19 + Место 33 пара, и я хочу, следующий результат:

Ind Letter Place Position Ind Letter Place Position 
1 A  19 23  1 T  33 15 
2 B  19 23  2 T  33 15 
3 B  19 23  3 T  33 15 
4 B  19 23  4 C  33 15 

1 A  19 23  1 C  33 26 
2 B  19 23  2 T  33 26 
3 B  19 23  3 T  33 26 
4 B  19 23  4 C  33 26 

1 B  19 34  1 T  33 15 
2 A  19 34  2 T  33 15 
3 B  19 34  3 T  33 15 
4 B  19 34  4 C  33 15 

1 B  19 34  1 C  33 26 
2 A  19 34  2 T  33 26 
3 B  19 34  3 T  33 26 
4 B  19 34  4 C  33 26 

1 C  19 52  1 T  33 15 
2 T  19 52  2 T  33 15 
3 C  19 52  3 T  33 15 
4 T  19 52  4 C  33 15 

1 C  19 52  1 C  33 26 
2 T  19 52  2 T  33 26 
3 C  19 52  3 T  33 26 
4 T  19 52  4 C  33 26 

В этом случае уникальный означает, что A1: A2 равно A2: A1. Причина, по которой я хочу это сделать, заключается в том, что я хочу выполнить четырехмерную проверку на пары, чтобы увидеть, существуют ли все возможные комбинации буквы. Так, например, для последней комбинированной пары выше у нас есть пары букв CC, TT, CT, TC, поэтому эта комбинированная пара пройдет FGT.

Я попытался выполнить объединение с expand.grid, так как кажется, что это очень близко к тому, что я хочу. Однако, когда мне требуется всякое сочетание данных $ Position, я теряю информацию для Ind, Letter и Place. Также вывод включает в себя не уникальные пары.

Может ли кто-нибудь указать мне на инструмент, который ближе к тому, что я хочу? Или дайте мне некоторые рекомендации о том, как изменить расширение.grid, чтобы получить то, что мне нужно. Если вы знаете об инструменте, на самом деле это тест Four-Gamete-Test или что-то подобное, то это, конечно, также будет интересно для меня посмотреть.

+0

Могли бы вы PLS dput кадров данных, которые у вас есть. Я предлагаю вам создать ключ для парных мест, а затем выполнить крест-соединение. –

+0

Я не уверен, как использовать данные. Я предполагаю, что вы этого хотите, поэтому вы можете импортировать данные, верно? У меня есть данные как .csv, но я не знаю, как связать это с вопросом. – Hjalte

+0

Извините, я не понял: я могу выполнить функцию dput, но я не уверен, что делать с результирующим файлом. Я просто вставляю его в свой вопрос или мне нужно как-то прикреплять его как файл? – Hjalte

ответ

0

Вы можете использовать expand.grid, но не непосредственно на колонке Position. Идея заключается в том, чтобы найти все комбинации «четверок» (уникальные позиции):

pair <- c(19, 33) 

df1 <- df1[df1$Place %in% pair, ] 
split1 <- split(df1, df1$Position) 

vec1 <- unique(df1$Position[df1$Place == pair[1]]) 
vec2 <- unique(df1$Position[df1$Place == pair[2]]) 

combin_num <- expand.grid(vec2, vec1)[,2:1] 

do.call( 
    rbind, 
    lapply(seq_len(nrow(combin_num)), function(i){ 
    cbind(split1[[as.character(combin_num[i,1])]], 
      split1[[as.character(combin_num[i,2])]] ) 
    }) 
)[,] 

Результат:

#  Ind Letter Place Position Ind.1 Letter.1 Place.1 Position.1 
# 1  1  A 19  23  1  T  33   15 
# 2  2  B 19  23  2  T  33   15 
# 3  3  B 19  23  3  T  33   15 
# 4  4  B 19  23  4  C  33   15 
# 5  1  A 19  23  1  C  33   26 
# 6  2  B 19  23  2  T  33   26 
# 7  3  B 19  23  3  T  33   26 
# 8  4  B 19  23  4  C  33   26 
# 51 1  B 19  34  1  T  33   15 
# 61 2  A 19  34  2  T  33   15 
# 71 3  B 19  34  3  T  33   15 
# 81 4  B 19  34  4  C  33   15 
# 52 1  B 19  34  1  C  33   26 
# 62 2  A 19  34  2  T  33   26 
# 72 3  B 19  34  3  T  33   26 
# 82 4  B 19  34  4  C  33   26 
# 9  1  C 19  52  1  T  33   15 
# 10 2  T 19  52  2  T  33   15 
# 11 3  C 19  52  3  T  33   15 
# 12 4  T 19  52  4  C  33   15 
# 91 1  C 19  52  1  C  33   26 
# 101 2  T 19  52  2  T  33   26 
# 111 3  C 19  52  3  T  33   26 
# 121 4  T 19  52  4  C  33   26 
Смежные вопросы