Попробуйте это,
df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"))
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B"
Так как это работает?
Мы применяем функцию к каждой строке фрейма данных, поэтому мы можем взятькаждая строка за раз.Возьмем вторую строку df:
df[2,]
x y
1 B A
Затем мы разбиваем (strsplit
) это и unlist
на вектор каждой буквы (Мы используем as.matrix
чтобы выделить элементы)
unlist(strsplit(as.matrix(df[2,]), " "))
[1] "B" "A"
Используйте функцию сортировки, чтобы расположить в алфавитном порядке, а затем вставьте их вместе,
paste(sort(unlist(strsplit(as.matrix(df[2,]), " "))), collapse = " ")
[1] "A B"
Затем функция apply
делает это для всех строк, так как мы устанавливаем индекс на 1, а затем используем функцию unique
для определения уникальных ребер.
Extension
Это может быть расширено до n переменных, например, n = 3,
df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"), z = c("C", "D", "D"))
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B C" "A B D"
Если требуется больше букв, просто объедините две буквы, как показано ниже,
df <- data.frame(x=c("A", "BC", "A"), y = c("B", "A", "BC"))
df
x y
1 A B
2 BC A
3 A BC
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B" "A BC"
Старая версия
Используя пакет tidyverse
, создайте функцию с именем rev
, которая может упорядочивать наши ребра, затем используйте mutate
, чтобы создать новый столбец, объединяющий столбцы x и y,таким образом, он хорошо работает с функцией rev
, затем запустите новый столбец через функцию и найдите уникальные пары.
library(tidyverse)
rev <- function(x){
unname(sapply(x, function(x) {
paste(sort(trimws(strsplit(x[1], ',')[[1]])), collapse=',')} ))
}
df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"))
rows <- df %>%
mutate(both = c(paste(x, y, sep = ", ")))
unique(rev(rows$both))