#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")
)
)