Как извлечь значения из столбца, соответствующего максимальным значениям других столбцов в кадре данных - PullRequest
3 голосов
/ 25 апреля 2020

У меня есть такой кадр данных:

[,1] [,2] [,3] [,4] [,5] [,6]
 a    1    5     7    9    4
 b    2    8     2    3    5
 c    3    9     2    4    8
 d    4    2     6    1    3

И я хотел бы получить значения столбца [, 1], основываясь на максимальных значениях других столбцов. Результат должен быть примерно таким:

[1] "d" "c" "a" "a" "c"

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2020

Вы можете использовать max.col

  • , если это фрейм данных df
> df[max.col(t(df[-1])),1]
[1] "d" "c" "a" "a" "c"
  • , если это матрица m
> m[max.col(t(as.numeric(m[,-1]))),1]
[1] "d" "c" "a" "a" "c"

Данные

df <- structure(list(V1 = c("a", "b", "c", "d"), V2 = 1:4, V3 = c(5L, 
8L, 9L, 2L), V4 = c(7L, 2L, 2L, 6L), V5 = c(9L, 3L, 4L, 1L), 
    V6 = c(4L, 5L, 8L, 3L)), class = "data.frame", row.names = c(NA, 
-4L))

m <- structure(c("a", "b", "c", "d", "1", "2", "3", "4", "5", "8", 
"9", "2", "7", "2", "2", "6", "9", "3", "4", "1", "4", "5", "8", 
"3"), .Dim = c(4L, 6L))
3 голосов
/ 25 апреля 2020

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

df$V1[sapply(df[-1], which.max)]
#[1] "d" "c" "a" "a" "c"

Если у вас есть матрица (которая выглядит более вероятной), тогда все значения превратятся в символ из-за первого столбца, в этом случае вы можете сделать:

mat[apply(mat[, -1], 2, function(x) which.max(as.numeric(x))), 1]
#[1] "d" "c" "a" "a" "c"

данные

df <- structure(list(V1 = c("a", "b", "c", "d"), V2 = 1:4, V3 = c(5L, 
8L, 9L, 2L), V4 = c(7L, 2L, 2L, 6L), V5 = c(9L, 3L, 4L, 1L), 
V6 = c(4L, 5L, 8L, 3L)), row.names = c(NA, -4L), class = "data.frame")

mat <- structure(c("a", "b", "c", "d", "1", "2", "3", "4", "5", "8", 
"9", "2", "7", "2", "2", "6", "9", "3", "4", "1", "4", "5", "8", 
"3"), .Dim = c(4L, 6L))
0 голосов
/ 25 апреля 2020

Мы можем преобразовать в «длинный» формат и затем slice, чтобы получить значение первого столбца (при условии, что это data.frame

library(dplyr)
library(tidyr)
df %>%
    pivot_longer(cols = -V1) %>%
    group_by(name) %>% 
    slice(which.max(value)) %>% 
    pull(V1)
#[1] "d" "c" "a" "a" "c"

Если это matrix, преобразовать до data.frame с as.data.frame

данные

df <- structure(list(V1 = c("a", "b", "c", "d"), V2 = 1:4, V3 = c(5L, 
8L, 9L, 2L), V4 = c(7L, 2L, 2L, 6L), V5 = c(9L, 3L, 4L, 1L), 
    V6 = c(4L, 5L, 8L, 3L)), class = "data.frame", row.names = c(NA, 
-4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...