r - 如何删除两列中具有相同值的行和与先前观测值重复的行,无论顺序如何



考虑此处创建的数据框Data

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

我想手动进行成对比较。首先,我想找到DataLocation级别之间所有可能的成对组合,所以我使对象Pairs如下所示:

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

现在我想从对象中删除行PairsPairs$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的位置,但这对第二个问题没有帮助

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

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

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

您的数据帧:

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

删除变量 1 = 变量 2

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

最新更新