2014-04-23 5 views
4

참가자가 오디오 쌍을 듣는 두 번의 실험에서 데이터를 얻었습니다. 이제 세그먼트가 한 번만 나타나는 쌍의 작은 목록을 얻으려고합니다.두 개의 열에서 고유 한 값을 기반으로 행 제거

data <- structure(c("38", "39", "48", "50", "55", "68", "143", "'00123_16_02 Firestarter_timbre.txt'", 
"'00123_16_02 Firestarter_timbre.txt'", "'00123_16_02 Firestarter_timbre.txt'", 
"'00123_16_02 Firestarter_timbre.txt'", "'00133_10_02 Loner_timbre.txt'", 
"'00133_10_02 Loner_timbre.txt'", "'00371_17_05 - Original_timbre.txt'", 
"'00133_10_02 Loner_timbre.txt'", "'00030_11_01 Get Your Snack On_timbre.txt'", 
"'00845_03_11 - Flying Lotus - Parisian Goldfish_timbre.txt'", 
"'01249_17_UMEK - Efortil_timbre.txt'", "'00030_11_01 Get Your Snack On_timbre.txt'", 
"'01300_08_02 - Clipper_timbre.txt'", "'01300_08_02 - Clipper_timbre.txt'", 
"MRHT", "MRHT", "MRHT", "MRHT", "MRHT", "MRHT", "MRHT", "12", 
"9", "14", "11", "14", "15", "12", "11", "12", "14", "15", "14", 
"14", "11", "2.75", "2.22222222222222", "2.21428571428571", "2.54545454545455", 
"2.28571428571429", "2.53333333333333", "2.25", "2.81818181818182", 
"3.25", "3.14285714285714", "2.93333333333333", "3.14285714285714", 
"3.07142857142857", "2.90909090909091", "0.621581560508061", 
"0.97182531580755", "1.25137287246211", "1.21355975243384", "0.994490316197694", 
"0.743223352957207", "1.05528970602217", "0.873862897505303", 
"0.753778361444409", "0.662993544131796", "1.03279555898864", 
"0.662993544131796", "0.997248963150875", "1.04446593573419"), .Dim = c(7L, 
10L), .Dimnames = list(NULL, c("pair.number", "Segment1", "Segment2", 
"category", "Rhythm.n", "Timbre.n", "Rhythm.mean", "Timbre.mean", 
"Rhythm.sd", "Timbre.sd"))) 

세그먼트가 모두 "Segment1"와 "Segment2"를 통해 자신을 반복하지 않는 쌍 세트를 얻을 수있는 방법이 있나요 : 다음은 각 행이 한 쌍을 나타내는 내 데이터의 샘플입니다? 다음과 같이 표시됩니다.

structure(c("48", "55", "143", "'00123_16_02 Firestarter_timbre.txt'", 
"'00133_10_02 Loner_timbre.txt'", "'00371_17_05 - Original_timbre.txt'", 
"'00845_03_11 - Flying Lotus - Parisian Goldfish_timbre.txt'", 
"'00030_11_01 Get Your Snack On_timbre.txt'", "'01300_08_02 - Clipper_timbre.txt'", 
"MRHT", "MRHT", "MRHT", "14", "14", "12", "14", "14", "11", "2.21428571428571", 
"2.28571428571429", "2.25", "3.14285714285714", "3.14285714285714", 
"2.90909090909091", "1.25137287246211", "0.994490316197694", 
"1.05528970602217", "0.662993544131796", "0.662993544131796", 
"1.04446593573419"), .Dim = c(3L, 10L), .Dimnames = list(NULL, 
    c("pair.number", "Segment1", "Segment2", "category", "Rhythm.n", 
    "Timbre.n", "Rhythm.mean", "Timbre.mean", "Rhythm.sd", "Timbre.sd" 
    ))) 

감사합니다.

+0

이 경우 수동으로 고유 세그먼트가 포함 된 것을 선택하여 쌍을 만듭니다. 세그먼트가 나열된 열에 관계없이 반복을 피해야합니다. – DavidLopezM

답변

2

편집 : 두 번째 코드 행은 이제 Segment1 열의 아무 것도 Segment2 열에 나타나지 않도록합니다. 이 솔루션은 가능한 최대 행 수보다 적은 수를 반환합니다.

이것은 Segement1의 값이 고유한지 확인 : 그런 다음 Segment2 열에서 중복을 제거하기 위해이 작업을 실행할 수 있습니다

data <- data[!duplicated(data[, "Segment1"]),] 

; 이것은 또한 Segment2가 Segment1 열에 어디서나 나타나는 모든 행 제거 :

data <- data[!duplicated(data[, "Segment2"]) & !(data[, "Segment2"] %in% data[, "Segment1"]),] 
+0

잠시 동안 'duplicated'를 사용했는데 여전히 Segment1 및 Segment2 열에서 반복되는 값을 제공합니다. 이것을 막는 방법을 알고 있습니까? – DavidLopezM

2

그것은 당신이 '일치 그래프'라고 무엇을 원하는 같은 소리를 - 당신의 정점 트랙이며, 가장자리는 경우 그들 사이에가는 사람들 한 쌍으로 들었다. 그런 다음 일반적인 정점이없는 모서리 집합 (일치)을 찾아야하며, 가장 이상적인 집합 (최대 매칭)을 찾아야합니다.

R의 igraph 패키지에는 maximum.bipartite.matching이라는 기능이 있습니다.이 기능을 호출하려면 세그먼트 1과 세그먼트 2를 그래프로 표시해야합니다. 의 라인을 따라 뭔가 :이 대부분

seg1 <-df$Segment1 
seg2 <- df$Segment2 
levs <- unique(c(seg1, seg2)) 
seg1 <- as.integer(factor(seg1, levels=levs)) 
seg2 <- as.integer(factor(seg2, levels=levs)) 
library(igraph) 
reord <- order(c(1:length(seg1), 1:length(seg2))) 
gr <- graph(c(seg1, seg2)[reord]) 
maximum.bipartite.matching(gr) 

올바른 형식으로 정점을 얻는 것입니다 : 우리는 일반적인 수준 요소로 캐스팅 한 후 정수로 돌립니다. seg1_1, seg2_1, seg1_2, seg2_2, seg1_3, seg2_3, ...) 형태로 섞어서 정점 쌍을 만든 다음 그 중 하나의 그래프 객체를 만듭니다. 최종 라인의 출력은 오디오 트랙 쌍 중 어느 것도 겹치지 않도록 가장 많은 수의 오디오 트랙을 찾습니다. 이를 추출하여 원래 데이터 세트로 다시 매핑해야합니다.

+0

그게 아마도 _bipartite_ 그래프로 설정하지 않았기 때문이라고 생각합니다. 미안합니다. 'V (gr) $ type <- FALSE'를 설정하면 함수가 작동 할 것입니다. 그러나 세 개의 에지가 있어야한다고 말하지만 함수는 단지 세 개를 찾은 것 같습니다 - 어쩌면이 그래프를 인위적으로 강요 한 결과 일 것입니다 바이 파트 타이트. 어쩌면 다른 사람이 더 나은 그래프 매칭 알고리즘을 알고 있습니다. R –

+0

다음 오류가 나타납니다. '.all ("R_igraph_create", as.numeric (edges) - as.numeric (n))의 오류 : at type_indexededgelist .c : 117 : 음의 수의 정점이있는 빈 그래프를 만들 수 없습니다. 유효하지 않은 값입니다. – DavidLopezM

+0

'seg1'과'seg2'가 올바른 값을 얻고 있는지 확인하십시오 - 다섯 번째 라인에서는 누락 된 값이없는 정수 여야합니다. Segment1의 정확한 클래스 인 경우 처음에는 'as'를 캐스트해야 할 수 있습니다.문자 (df $ Segment1)'등 –

관련 문제