Сортировка значений в списке по столбцам матрицы - PullRequest
1 голос
/ 16 июня 2020

Мне нужно отсортировать значения каждого столбца во фрейме данных на основе значений в отдельной матрице. Обратите внимание, что каждый столбец должен быть отсортирован независимо от других столбцов (т. Е. Не только по индексу строки). Матрица имеет те же размеры, что и фрейм данных, а значения соответствуют номеру строки, которая должна быть возвращена из фрейма данных. *

Я понимаю, что это можно сделать с помощью al oop, но я ищу более эффективный способ, поскольку я буду обрабатывать большие наборы данных.

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Один вариант с использованием функций baseR:

data[] <- Map(`[`, data, split(sorting_order, col(sorting_order)))
data
# A tibble: 3 x 3
#  name           height  mass
#  <chr>           <int> <dbl>
#1 C-3PO              96    77
#2 R2-D2             167    32
#3 Luke Skywalker    172    75

1) Из вашей матрицы мы создаем список векторов:

split(sorting_order, col(sorting_order))
#$`1`
#[1] 2 3 1
#
#$`2`
#[1] 3 2 1
#
#$`3`
#[1] 1 3 2

Более простой способ, упомянутый в комментариях is asplit

asplit(sorting_order, 2)

Благодаря @ GKi

2) Map используется для перестановки data согласно списку из 1). В качестве примера возьмем первый столбец:

data[, 1, drop = TRUE][c(2,3,1)]
#[1] "R2-D2"          "Luke Skywalker" "C-3PO" 

Это делается только для каждого столбца.

0 голосов
/ 16 июня 2020

Другой подход Base-R

do.call(cbind,lapply(1:ncol(data), function(x)  data[sorting_order[x,],][,x]))

            name height mass
1          C-3PO     96   77
2          R2-D2    167   77
3 Luke Skywalker     96   75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...