¿Cómo seleccionar la fila con el valor máximo en cada grupo en R Language?

En el lenguaje de programación R, para seleccionar la fila con el valor máximo en cada grupo de un marco de datos, podemos usar varios enfoques, como se explica a continuación.

Considere el siguiente conjunto de datos con múltiples observaciones en la subcolumna. Este conjunto de datos contiene tres columnas como sr_no, sub y marcas.

Creación de conjunto de datos:

Aquí estamos creando un marco de datos para demostración.

Bloque de código

Producción: 

   roll sub marks
1      1   A     2
2      2   A     3
3      3   B     5
4      4   B     2
5      5   B     5
6      6   C     8
7      7   C    17
8      8   A     3
9      9   C     5
10    10   C     5

Aquí, roll y las marcas son valores enteros y sub es el valor categórico (char) tienen categoría A, B, C. En este conjunto de datos, A, B, C representan diferentes temas y las marcas son marcas obtenidas en el sub correspondiente.

Como podemos ver el sujeto A, B, C tiene el valor máximo (puntos) de 3,5,17 respectivamente en el grupo. Podemos seleccionar la fila máxima en el grupo usando los siguientes dos enfoques.

Métodos 1: Usando la base R.

Paso 1: Cargue el conjunto de datos en una variable (grupo). 

R

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
  
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
group

Producción:  

   roll sub marks
1      1   A     2
2      2   A     3
3      3   B     5
4      4   B     2
5      5   B     5
6      6   C     8
7      7   C    17
8      8   A     3
9      9   C     5
10    10   C     5

Paso 2: Ordenó las marcas en orden descendente para cada grupo (A, B, C).

R

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
sorted_group

Producción:

   roll sub marks
2      2   A     3
8      8   A     3
1      1   A     2
3      3   B     5
5      5   B     5
4      4   B     2
7      7   C    17
6      6   C     8
9      9   C     5
10    10   C     5

Como nuestro sub está ahora en orden ascendente y estamos listos para seleccionar la fila con el valor máximo en cada grupo, aquí los grupos son A, B, C.

Paso 3: elimine las filas duplicadas de la columna de asunto ordenado.

R

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
# removing duplicates from the sorted sub column
ans <- sorted_group[!duplicated(sorted_group$sub),]
  
ans

Producción:

Estas son la fila seleccionada con el valor máximo en cada grupo.

Métodos 2: Uso del paquete dplyr

dplyr es un paquete n R que se usa más comúnmente para manipular el marco de datos. dplyr proporciona varios verbos (funciones) para la manipulación de datos, como filtrar, organizar, seleccionar, renombrar, mutar, etc.

Para instalar el paquete dplyr tenemos que ejecutar el siguiente comando en la consola R.

install.packages("dplyr")

Paso 1: Cargue el conjunto de datos y la biblioteca.

R

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")

Paso 2: ahora agrupe el submarco de datos usando group_ by verb (función) y seleccione la fila que tiene marcas máximas usando which.max() .

R

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5,
          8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")
  
group %>% group_by(sub) %>% slice(which.max(marks))

Producción: 

Como podemos ver, estas son la fila seleccionada con el valor máximo en cada grupo.

Publicación traducida automáticamente

Artículo escrito por amnindersingh1414 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *