R语言 如何移除两列中具有相同值的行以及与以前的观测重复的行(无论顺序如何)

ha5z0ras  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(308)

考虑在此处创建的 Dataframe Data

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

我想手动进行两两比较。首先,我想在Data中找到Location的水平之间所有可能的两两组合,所以我像这样创建对象Pairs

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

现在,我想从对象Pairs中删除行,其中Pairs$Var1 == Pairs$Var2,我想删除与以前的对“重复”的行,但顺序相反。换句话说,我想删除Pairs$Var1 == a & Pairs$Var2 == aPairs$Var1 == b & Pairs$Var2 == b等的行。(即,我不想将Locations与它们自己进行比较),并且我也不想进行两次相同的比较,因此如果Var1==a已经进行了比较(或者已经存在于data.frame中)到Var2 == b,那么我不想比较Var1 == bVar2 == a,所以我需要删除其中一个组合,但不是另一个(我希望这有意义)。我怎么能做到这一点?
我们可以使用Pairs[Pairs$Var1 == Pairs$Var2,]来查看Var1 == Var2的位置,但这对第二个问题没有帮助

yqhsw0fo

yqhsw0fo1#

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

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

或者,如果你想要相反的

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

这是因为a < aFalse(一个项目不小于它自己),对于每一对(a, b)a < bb < aTrue,另一个是False。这样,对于每一个这样的对,你只保留一个。
因此,as.character(Pairs$Var1) < as.character(Pairs$Var2)返回一个TrueFalse的向量,你可以用它来切片你的data.frame。需要as.character()是因为你不能用<比较factor s。

qltillow

qltillow2#

我发布了一个使用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
4ioopgfo

4ioopgfo3#

您的数据框:

df <- data.frame(Location = rep(letters[1:20], each = 10))
df <-expand.grid(unique(df$Location),unique(df$Location))
dim(df) # 400 rows x 2 columns

删除重复项:

df = df[!duplicated(t(apply(df, 1, sort))), ]
dim(df) # 210 rows x 2 columns

删除Var1 = Var2

df = subset(df, df$Var1 != df$Var2)
dim(df) # 190 rows x 2 columns

相关问题