Предполагая d
ваша матрица, а не c
:
e <- unique(apply(d,1,function(x) paste(sort(x),collapse="~")))
> t(sapply(strsplit(e,"~"),as.numeric))
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 2 5
[5,] 1 6
разбив его:
Первая линия
apply(d,1,function(x) ...)
берет каждую строку д и передает его в качестве вектора x
к анонимную функцию, чье тело я назвал здесь ...
.
Тело функции paste(sort(x),collapse="~")
, которое сортирует вектор и затем превращает его в вектор длины с каждым элементом, разделенным ~
.
Таким образом, общая сумма вызовов будет возвращать вектор символов, где каждый элемент использовался как строка матрицы.
Тогда unique
хранит только уникальные элементы. Сортировка гарантирует, что это делает то, что мы хотим.
Вторая линия
strsplit(e,"~")
разделяет наш вектор символов обратно в разделенном виде. В этом случае это список, в котором каждый элемент является символьным вектором чисел, составляющих каждую строку.
sapply(...,as.numeric)
применяет as.numeric()
к каждому элементу списка. Поэтому мы преобразуем вектор символов обратно в числовой вектор. Поскольку s
в sapply
означает «упростить», он создаст из этого матрицу.
Но это неправильное направление (2x5 вместо 5x2)! t()
переносит матрицу в исходную форму.
'c' функция в R и никогда не должны использоваться в качестве имени переменной. – dayne
Можете ли вы поделиться тем, что вы пробовали до сих пор? Это довольно простой вопрос, на который, вероятно, уже был дан ответ. Вы обнаружите, что получите гораздо лучшие ответы, если не только предоставить некоторые данные, но и поделиться своими шагами по решению проблемы самостоятельно. – Justin
Извините. Мой DataFrame огромен (90M строк). Я использовал следующие шаги для подмножества данных. – Ram