考虑在此处创建的 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 == 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
的位置,但这对第二个问题没有帮助
3条答案
按热度按时间yqhsw0fo1#
确保两列不同并且没有对称重复的一个巧妙技巧是使用“大于”或“小于”运算符。
或者,如果你想要相反的
这是因为
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
s。qltillow2#
我发布了一个使用
for
的解决方案:首先,删除两列中具有相同值的行:
二、去除“标准”重复:
最后,删除重复的是相反的顺序。我的策略涉及到创建一个临时列,允许您(a)不进行搜索的情况下,你知道已经是重复的;(B)进行最后的过滤。然后,您可以删除临时列:
4ioopgfo3#
您的数据框:
删除重复项:
删除Var1 = Var2