use*_*121 9 r duplicates dataframe
这似乎是一个简单的问题,但我似乎无法弄明白.如果两列具有相同的值,我想从数据帧(df)中删除重复项,即使这些值的顺序相反.我的意思是,说你有以下数据框:
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c('A','B','B','C','A','A','B','B')
df <-data.frame(a,b)
a b
1 A A
2 A B
3 A B
4 B C
5 B A
6 B A
7 C B
8 C B
Run Code Online (Sandbox Code Playgroud)
如果我现在删除重复项,我会得到以下数据框:
df[duplicated(df),]
a b
3 A B
6 B A
8 C B
Run Code Online (Sandbox Code Playgroud)
但是,我还想删除该数据帧中的第6行,因为"A","B"与"B","A"相同.我该如何自动执行此操作?
理想情况下,我可以指定要比较哪两列,因为数据帧可能具有不同的列,并且可能非常大.
谢谢!
扩展Ari的答案,指定列以检查其他列是否也存在:
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c('A','B','B','C','A','A','B','B')
df <-data.frame(a,b)
df$c = sample(1:10,8)
df$d = sample(LETTERS,8)
df
a b c d
1 A A 10 B
2 A B 8 S
3 A B 7 J
4 B C 3 Q
5 B A 2 I
6 B A 6 U
7 C B 4 L
8 C B 5 V
cols = c(1,2)
newdf = df[,cols]
for (i in 1:nrow(df)){
newdf[i, ] = sort(df[i,cols])
}
df[!duplicated(newdf),]
a b c d
1 A A 8 X
2 A B 7 L
4 B C 2 P
Run Code Online (Sandbox Code Playgroud)
一种解决方案是首先对 的每一行进行排序df:
for (i in 1:nrow(df))
{
df[i, ] = sort(df[i, ])
}
df
a b
1 A A
2 A B
3 A B
4 B C
5 A B
6 A B
7 B C
8 B C
Run Code Online (Sandbox Code Playgroud)
此时只需删除重复元素即可:
df = df[!duplicated(df),]
df
a b
1 A A
2 A B
4 B C
Run Code Online (Sandbox Code Playgroud)
正如 thelatemail 在评论中提到的,您的代码实际上保留了重复项。您需要使用!duplicated来删除它们。