【问题标题】:How to remove rows that have the same value in two columns and rows that are duplicates of previous observations, regardless of order如何删除在两列中具有相同值的行以及与先前观察重复的行,而不管顺序如何
【发布时间】:2020-07-08 13:15:05
【问题描述】:

考虑这里创建的数据框Data

Data <- data.frame(Location = rep(letters[1:20], each = 10))

我想手动进行成对比较。首先,我想在Data 中找到Location 级别之间所有可能的成对组合,所以我将对象Pairs 设为这样:

Pairs <-expand.grid(unique(Data$Location),unique(Data$Location))

现在我想从Pairs$Var1 == Pairs$Var2 的对象Pairs 中删除行,并且我想删除与先前对“重复”的行,但顺序相反。 换句话说,我想删除Pairs$Var1 == a & Pairs$Var2 == aPairs$Var1 == b & Pairs$Var2 == b 等的行(即,我不想将Locations 与自己进行比较),我也不想'不希望进行两次相同的比较,所以如果 Var1==a 已经被比较(或已经存在于 data.frame 中的较早部分)到 Var2 == b,那么我不想比较 Var1 == b 到 @987654337 @,所以我需要删除其中一个组合,而不是另一个(我希望这是有道理的)。 我该怎么做?

我们可以使用Pairs[Pairs$Var1 == Pairs$Var2,]查看Var1 == Var2在哪里,但这对第二个问题没有帮助

【问题讨论】:

  • Pairs[Pairs$Var1 &lt; Pairs$Var2,] 做你想做的事吗?根据您的 stringsAsFactors 设置,您可能需要 Pairs[as.character(Pairs$Var1) &lt; as.character(Pairs$Var2),]
  • @Bas Pairs[as.character(Pairs$Var1) &lt; as.character(Pairs$Var2),] 做我想做的事,虽然我不太明白为什么,你愿意在回复中详细说明吗?这样我也可以接受你的回答。另外,如何在不创建新对象的情况下从Pairs 中删除这些行?我一直在尝试类似:Pairs &lt;- Pairs[-c(as.character(Pairs$Var1) &lt; as.character(Pairs$Var2)),] 但没有任何工作

标签: r subset unique pairwise


【解决方案1】:

一个巧妙的技巧是使用“大于”或“小于”运算符,以确保两列不同并且没有对称重复。

Pairs <- Pairs[as.character(Pairs$Var1) < as.character(Pairs$Var2),]

或者,如果你想要相反,

Pairs <- Pairs[as.character(Pairs$Var1) >= as.character(Pairs$Var2),]

之所以有效,是因为a &lt; aFalse(一个项目不小于它自己),并且对于每一对(a, b)a &lt; bb &lt; aTrue,另一个是False。这样,对于每一对这样的对,您只保留一个。

因此as.character(Pairs$Var1) &lt; as.character(Pairs$Var2) 返回一个由TrueFalse 组成的向量,您可以使用它来分割您的data.frame。需要as.character(),因为无法使用&lt; 比较factors。

【讨论】:

    【解决方案2】:

    我发布了一个使用for 的解决方案:

    首先,删除两列中具有相同值的行:

    Pairs <- Pairs[Pairs$Var1 != Pairs$Var2,]
    

    其次,删除“标准”重复项:

    Pairs <- Pairs[!duplicated(Pairs),]
    

    最后,删除顺序相反的重复项。我的策略包括创建一个临时列,允许您 (a) 不要搜索您已经知道重复的案例; (b) 进行最后的过滤。然后,您可以删除临时列:

    Pairs$my_duplicated <- FALSE
    for(i in 1:nrow(Pairs)){
      if(Pairs$my_duplicated[i] == FALSE){
        my_test <- Pairs$Var2 %in% Pairs$Var1[i] & Pairs$Var1 %in% Pairs$Var2[i]
        Pairs$my_duplicated[my_test] <- TRUE
      }
    }
    Pairs <- Pairs[!Pairs$my_duplicated,]
    Pairs$my_duplicated <- NULL
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      相关资源
      最近更新 更多