考虑此处创建的数据框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 == a
、Pairs$Var1 == b
&Pairs$Var2 == b
等行(即,我不想将Locations
与它们进行比较),我也不希望进行两次相同的比较,所以如果Var1==a
已经被比较(或已经存在于 data.frame 中更早)到Var2 == b
, 然后我不想将Var1 == b
与Var2 == 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 < a
是False
(一个项目不小于它自己),并且对于每对(a, b)
a < b
或b < a
True
,另一个是False
。这样,对于每对这样的,你只保留一个。
因此,as.character(Pairs$Var1) < as.character(Pairs$Var2)
返回一个True
和False
向量,您可以使用该向量对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