Автоматическая сортировка и добавление данных

#r

#r

Вопрос:

Я добавляю столбцы последовательно, из одного фрейма данных в другой на основе уникального отсортированного порядка из другого столбца в фрейме данных. Я пытаюсь автоматизировать этот процесс, чтобы столбцы автоматически сортировались перед добавлением нового столбца. Ниже приведен пример. Фрейм данных df содержит данные, по которым фрейм данных должен быть отсортирован. Фрейм данных df2 содержит столбцы, которые должны быть добавлены в фрейм данных последовательно.

 df <- data.frame("ID" = 1:16)
df$col_A <- c(1,2,3,4,5,6,7,8,8,9,10,11,12,13,14,15)
df$col_B <- c(10,1,10,1,12,12,12,12,1,14,13,14,16,16,16,16)
df$col_C <- c(10,12,14,3,10,12,14,16,10,12,14,16,10,5,14,16)
df$col_D <- c(10,12,14,16,10,12,4,16,10,12,14,16,10,12,14,4)
df
   ID col_A col_B col_C col_D
1   1     1    10    10    10
2   2     2     1    12    12
3   3     3    10    14    14
4   4     4     1     3    16
5   5     5    12    10    10
6   6     6    12    12    12
7   7     7    12    14     4
8   8     8    12    16    16
9   9     8     1    10    10
10 10     9    14    12    12
11 11    10    13    14    14
12 12    11    14    16    16
13 13    12    16    10    10
14 14    13    16     5    12
15 15    14    16    14    14
16 16    15    16    16     4

df2 <- data.frame("ID" = 1:16)
df2$A_rank <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
df2$B_rank <- c(7,9,10,8,11,12,14,13,15,4,5,3,6,2,16,1)
df2$C_rank <- c(1,12,2,16,3,4,5,15,6,7,9,8,10,11,13,14)
df2$D_rank <- c(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
df2
   ID col_A col_B col_C col_D
1   1     1    10    10    10
2   2     2     1    12    12
3   3     3    10    14    14
4   4     4     1     3    16
5   5     5    12    10    10
6   6     6    12    12    12
7   7     7    12    14     4
8   8     8    12    16    16
9   9     8     1    10    10
10 10     9    14    12    12
11 11    10    13    14    14
12 12    11    14    16    16
13 13    12    16    10    10
14 14    13    16     5    12
15 15    14    16    14    14
16 16    15    16    16     4
  

Я могу выполнить этот процесс вручную, используя следующий код, но я не уверен, как это реализовать, чтобы он выполнялся автоматически по n числу переменных.

 df2 <- df2 %>% arrange(A_rank) %>% cbind(col_A) 
df2 <- df2 %>% arrange(B_rank) %>% cbind(col_B)
df2 <- df2 %>% arrange(C_rank) %>% cbind(col_C) 
df2 <- df2 %>% arrange(D_rank) %>% cbind(col_D) 
df2
   ID A_rank B_rank C_rank D_rank Var_A Var_B Var_C Var_D col_A col_B col_C col_D
1  16     16      1     14      1    15     1    16     4    15     1    16     4
2  15     15     16     13      2    14    16    14     4    14    16    14     4
3  14     14      2     11      3    13     1    14    10    13     1    14    10
4  13     13      6     10      4    12    12    14    10    12    12    14    10
5  12     12      3      8      5    11     1    12    10    11     1    12    10
6  11     11      5      9      6    10    10    12    10    10    10    12    10
7  10     10      4      7      7     9    10    12    12     9    10    12    12
8   9      9     15      6      8     8    16    10    12     8    16    10    12
9   8      8     13     15      9     8    16    16    12     8    16    16    12
10  7      7     14      5     10     7    16    10    12     7    16    10    12
11  6      6     12      4     11     6    14    10    14     6    14    10    14
12  5      5     11      3     12     5    14    10    14     5    14    10    14
13  4      4      8     16     13     4    12    16    14     4    12    16    14
14  3      3     10      2     14     3    13     5    16     3    13     5    16
15  2      2      9     12     15     2    12    14    16     2    12    14    16
16  1      1      7      1     16     1    12     3    16     1    12     3    16
  

Я понимаю, что могу пометить столбцы для выполнения сортировки и добавления, используя приведенные ниже строки кода, но не уверен, как написать функцию, которая включает эти имена столбцов и упорядоченные имена столбцов в процесс.

 col_names <- colnames(df %>% select(grep("col", colnames(.), value = TRUE)))
col_names
[1] "col_A" "col_B" "col_C" "col_D" 

ord_names <- colnames(df2 %>% select(grep("rank", colnames(.), value = TRUE)))
ord_names
[1] "A_rank" "B_rank" "C_rank" "D_rank"
  

Ответ №1:

Если вы хотите автоматизировать свой ручной процесс, вы можете использовать :

 library(dplyr)
library(purrr)

map2(ord_names, col_names, 
                    ~df2 %>% 
                      arrange(.data[[.x]]) %>% 
                      transmute(ID, !!.y := df[[.y]])) %>%
  reduce(inner_join, by = 'ID') %>%
  left_join(df2, by = 'ID')

#   ID col_A col_B col_C col_D A_rank B_rank C_rank D_rank
#1   1     1    12    10     4      1      7      1     16
#2   2     2     1    16    14      2      9     12     15
#3   3     3    14    12    12      3     10      2     14
#4   4     4    12    16    10      4      8     16     13
#5   5     5    13    14    16      5     11      3     12
#6   6     6    14     3    14      6     12      4     11
#7   7     7    16    10    12      7     14      5     10
#8   8     8    16    14    10      8     13     15      9
#9   9     8    16    12    16      9     15      6      8
#10 10     9     1    14     4     10      4      7      7
#11 11    10    12    10    12     11      5      9      6
#12 12    11    10    16    10     12      3      8      5
#13 13    12    12    12    16     13      6     10      4
#14 14    13     1    14    14     14      2     11      3
#15 15    14    16    10    12     15     16     13      2
#16 16    15    10     5    10     16      1     14      1

  

Ответ №2:

Базовое решение R (не нужен фрейм данных ранжирования):

 cbind(df, setNames(data.frame(Map(function(x){order(x)}, df[,grepl("\_[A-Z]$", names(df))])),
         paste0('rank_', LETTERS[1:length(grep("\_[A-Z]$", names(df)))])))