Получить имя столбца на основе совпадения значений строк в DF в R (более 3 имен столбцов)

#r

Вопрос:

У меня есть таблица, как показано ниже, я хотел бы собрать предложения на основе значения строки в R studio.

Это то, что у меня есть :

ID A B C D E F G
A 0.98 0.48 0.21 0.97 0.47 0.20 0.19
B 0.22 0.31 0.41 0.11 0.42 0.32 0.23
C 0.70 0.81 0.61 0.21 0.82 0.71 0.62

Я хотел бы иметь имена столбцов для top1 top2.. top7 .

ID A B C D E F G имя топ1 имя топ2 имя топ3 имя топ4 имя топ5 имя топ6 top7name
A 0.98 0.48 0.21 0.97 0.47 0.20 0.19 A D B E C F G
B 0.22 0.31 0.41 0.11 0.42 0.32 0.23 E C F B G A D
C 0.70 0.81 0.61 0.21 0.82 0.71 0.62 E B F A G C D

Ответ №1:

Есть лучшее решение, которое можно решить с помощью across — кто-нибудь скоро опубликует этот ответ.

 library(tidyverse)

df <- tibble::tribble(
  ~id,   ~A,   ~B,   ~C,   ~D,   ~E,   ~F,   ~G,
  "A", 0.98, 0.48, 0.21, 0.97, 0.47,  0.2, 0.19,
  "B", 0.22, 0.31, 0.41, 0.11, 0.42, 0.32, 0.23,
  "C",  0.7, 0.81, 0.61, 0.21, 0.82, 0.71, 0.62
  )

df %>% left_join (df %>% 
  pivot_longer(cols = A:G,
               names_to = "letters",
               values_to = "values") %>% 
  group_by(id) %>% 
  mutate(rank = dense_rank(desc(values))) %>% 
  arrange(id, rank) %>% 
  mutate(rank = glue::glue("top{rank}name") %>% as.character()) %>% 
  select(id, rank, letters) %>% 
  pivot_wider(names_from = "rank", values_from = "letters")
)
#> Joining, by = "id"
#> # A tibble: 3 x 15
#>   id        A     B     C     D     E     F     G top1name top2name top3name
#>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>    <chr>    <chr>   
#> 1 A      0.98  0.48  0.21  0.97  0.47  0.2   0.19 A        D        B       
#> 2 B      0.22  0.31  0.41  0.11  0.42  0.32  0.23 E        C        F       
#> 3 C      0.7   0.81  0.61  0.21  0.82  0.71  0.62 E        B        F       
#> # ... with 4 more variables: top4name <chr>, top5name <chr>, top6name <chr>,
#> #   top7name <chr>
 

Создано 2021-08-16 пакетом reprex (v1.0.0)

Ответ №2:

В базе R вы можете попробовать это, используя в df качестве своего data.frame. Используйте apply для последовательного просмотра ваших данных. Вы можете sort каждую строку и включить соответствующий столбец names . Это setNames позволяет переименовывать эти новые результирующие столбцы.

 cbind(
  df,
  setNames(
    data.frame(t(apply(df[-1], 1, function(x) names(sort(x, decreasing = T))))),
    paste0("top", 1:(ncol(df) - 1), "name")
  )
)