簡體   English   中英

根據兩列中的唯一值刪除行

[英]Remove rows based on unique values across two columns

我從兩個實驗中得到了一些數據,其中參與者聽了成對的音頻,現在我試圖獲得一個較小的對列表,其中段只出現一次。 以下是我的數據示例,其中每行代表一對:

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"
    )))

謝謝!

編輯:第二行代碼現在確保Segment1列中沒有任何內容出現在Segment2列中。 請注意,此解決方案可能返回的行數少於最大行數。

這可確保Segement1的值是唯一的:

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

然后,您可以運行此選項以刪除Segment2列中的重復項; 這也將刪除Segment2出現在Segment1列中任何位置的任何行:

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

聽起來你想要的是所謂的“匹配圖” - 你的頂點是軌道,如果你在一對中聽到它們,它們之間會有一條邊。 然后,您需要找到一組不包含公共頂點(匹配)的邊 - 並且理想情況下可能是最大的一組(最大匹配)。

有R中的一個函數igraph包,應該幫助這個叫maximum.bipartite.matching -你需要得到SEGMENT1和分段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,...)以給出頂點對,然后從它們中創建一個圖形對象。 最后一行的輸出將找到最大數量的音頻對,使得它們都不重疊。 您需要提取這些內容,並將它們映射回原始數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM