我的数据框比这个大得多。
但是我想要的是
x = data.frame(
A= c(3, 4, 5, 7,9),
B= c(7, 8, 9, 3,5),
C= c(11, 12, 13, 14,18)
)
我正在考虑第1行和第4行相同,因为对我来说(3,7)和(7,3)对是相同的(对(5,9)和(9,5)也对)。我只想留下一对。
结果应为:
x = data.frame(
A= c(3, 4, 5),
B= c(7, 8, 9),
C= c(11, 12, 13)
)
我该怎么做?
是否可以使用功能subset
来做到这一点?
答案 0 :(得分:3)
library(dplyr)
x <- x %>%
group_by(A, B) %>%
mutate(AB = paste0(min(A, B), max(A, B)))
x[!duplicated(x$AB), -4]
# # A tibble: 3 x 3
# # Groups: A, B [3]
# A B C
# <dbl> <dbl> <dbl>
# 1 3 7 11
# 2 4 8 12
# 3 5 9 13
答案 1 :(得分:1)
一种base
R解决方案。使用ifelse
和paste0
创建一个结合了A
和B
的变量,并把最小值放在第一位。然后,您可以使用duplicated
来标识重复值和子集。
index <- ifelse(x$A<x$B, paste0(x$A, '-', x$B), paste0(x$B, '-', x$A))
index
[1] "3-7" "4-8" "5-9" "3-7" "5-9"
x[!duplicated(index),]
A B C
1 3 7 11
2 4 8 12
3 5 9 13
自从您提到subset
。它与[]
的作用相同。
subset(x, !duplicated(index))
A B C
1 3 7 11
2 4 8 12
3 5 9 13
答案 2 :(得分:1)
这是一个base R
选项,其中包含pmin/pmax
和duplicated
x[!duplicated(with(x, pmin(A, B), pmax(A, B))),]
A B C
#1 3 7 11
#2 4 8 12
#3 5 9 13