根据两列唯一值删除行

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

谢谢!


为此,我手动选择了包含独特片段的配对。必须避免重复,无论该片段列在哪一列中。 - DavidLopezM
2个回答

2

编辑:现在第二行代码确保Segment1列中的任何内容都不会出现在Segment2列中。请注意,此解决方案可能返回少于最大可能数量的行。

这确保了Segement1的值是唯一的:

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

您可以运行以下命令来删除Segment2列中的重复项;这也将删除任何Segment1列中出现Segment2的行:
data <- data[!duplicated(data[, "Segment2"]) & !(data[, "Segment2"] %in% data[, "Segment1"]),]

我尝试使用“duplicated”一段时间,但仍然会在Segment1和Segment2列中出现重复值。你知道有什么方法可以防止这种情况吗? - DavidLopezM

2
看起来你想要一个“匹配图” - 你的顶点是轨道,如果它们成对被收听,则它们之间会有一条边。然后,你需要找到一组不包含公共顶点的边(匹配),并且最好是其中最大的一组(最大匹配)。
R的igraph包中有一个名为maximum.bipartite.matching的函数可以帮助你完成这个任务 - 你需要将segment1和segment2转换为图形表示形式才能调用该函数。大致如下:
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,...)以给出顶点对,然后创建一个图形对象。最后一行的输出将找到最多数量的音轨对,使得它们中没有任何重叠。您需要提取这些内容,并将其映射回原始数据集。


我认为这可能是因为我没有将它设置为二分图,抱歉。如果您设置 V(gr)$type <- FALSE,该函数应该可以正常工作,尽管我认为应该找到三条边,而该函数似乎只找到了三条边 - 也许是由于强制将此图形人为地变成二分图的结果。也许其他人在R中知道更好的图匹配算法。 - Gavin Kelly
然后我收到了以下错误: 错误:.Call(“R_igraph_create”,as.numeric(edges) - 1,as.numeric(n),:在type_indexededgelist.c:117处:无法使用负数顶点创建空图形,无效值 - DavidLopezM
检查seg1seg2是否获得了正确的值 - 到第五行时,它们应该是整数且没有任何缺失值。根据Segment1的确切类别,您可能需要最初将它们转换为as.character(df$Segment1)等。 - Gavin Kelly
我认为它提供的匹配是最大化的,因为不能添加任何会引入重叠的边 - 但它不一定能找到“最大”的最大集合(称为相当混乱的maxim_um_)- 我找不到这样一个算法的R实现。 - Gavin Kelly
感谢您抽出时间回答我的所有回复!在运行此代码并将其索引回主数据库后,由于某种奇怪的原因,我仍然会得到重复的值。我想明天我会寻找解决方案,并等待看看是否有其他人对如何做这个有所贡献。 - DavidLopezM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接