Cómo caer Min y Max en filas sobre múltiples columnas mientras saltas de filas incompletas -- r campo con dataframe camp Relacionados El problema

How to drop Min and Max in rows over multiple columns while skipping incomplete rows


0
vote

problema

Español

Recopilé algunos datos durante el verano que estoy tratando de analizar de una manera sencilla. Tengo algunas columnas, pero los datos en sí se extienden a través de 5 columnas y más de 100 filas.

Cada fila es un participante único con un ID de participante. Estoy tratando de dejar caer sus mediciones MIN y MAX en su fila, a través de las 5 columnas, que solo quedan 3 columnas. También necesito eliminar a cualquier persona que no tenga las 5 mediciones. Luego, con esas tres columnas, necesitaré promediar y crear una nueva 4ª columna que contenga el promedio.

Me estoy abriendo un poco con las diferentes maneras de hacer esto. Necesita poder pasar la vuelta a través de todas las filas. Por favor, hágamelo saber si tiene alguna sugerencia.

Esto es lo que se ve el contexto de datos (eumr) ...

Intent2

Original en ingles

I collected some data over the summer that I am trying to analyze in a simple way. I have a few columns, but the data itself spans through 5 columns and 100+ rows.

Each row is a single participant with a participant ID. I am trying to drop their min and max measurements in their row, through all 5 columns, thus having only 3 columns left. I also need to remove any individuals who do not have all 5 measurements. Then, with those three columns, I will need to average and create a new 4th column that contains the average.

I'm getting a little overwhelmed with the different ways to do this. It needs to be able to loop through all the rows. Please let me know if you have any suggestions.

This is what the dataframe (eumR) looks like...

> eumR town id eumr1 eumr2 eumr3 eumr4 eumr5 1 WLS SA4001 NA NA NA NA NA 2 WLS SA4002 NA NA NA NA NA 3 WLS SA4003 NA NA NA NA NA 4 WLS SA4004 NA NA NA NA NA 5 WLS SA4005 NA NA NA NA NA .... 80 BVL SA4080 12.6 15.2 13.6 14.9 14.2 81 BVL SA4081 15.2 16.5 16.5 17.3 20.5 82 BVL SA4082 15.1 14.8 14.5 14.6 16.7 83 BVL SA4083 15.6 15.8 15.8 15.5 13.2 84 BVL SA4084 15.7 15.8 17.3 17.9 20.8

     
 
 

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Puedes probar algo como esto:

  eumR <- eumR[complete.cases(eumR),]  eumR$mean <- apply(eumR, 1, function(x) {   x <- as.numeric(x[3:7])   mean(x[!(x %in% c(min(x),max(x)))])})   

No puedo depurar sin un ejemplo reproducible, proporcione uno.

 

You can try something like this:

eumR <- eumR[complete.cases(eumR),]  eumR$mean <- apply(eumR, 1, function(x) {   x <- as.numeric(x[3:7])   mean(x[!(x %in% c(min(x),max(x)))])}) 

I cannot debug without a reproducible example, please provide one.

 
 
0
 
vote

Esta es también una solución pivot_longer5 . Se convertiría de formato ancho a largo con pivot_longer que sería preferible para administrar este tipo de datos. drop_na eliminará filas de datos con valores faltantes.

Para cada town y id , sería Name0 para asegurarse de que tiene 5 filas de datos para cada uno según sea necesario. Luego, clasificaría los valores (con los lazos determinados al azar). Esto se asegurará de que puede calcular la media basada en 3 de los 5 valores en los casos de los lazos para un mínimo o máximo.

  Name111  
 

This is also a tidyverse solution. Would convert from wide to long format with pivot_longer which would be preferable for managing this kind of data. drop_na will remove rows of data with missing values.

For each town and id, would filter to ensure you have 5 rows of data for each as required. Then, would rank the values (with ties determined randomly). This will ensure you can calculate the mean based on 3 out of the 5 values in cases of ties for minimum or maximum.

library(tidyverse)  df %>%   pivot_longer(cols = starts_with("eumr"), names_to = "eumr", values_to = "value") %>%   drop_na(value) %>%   group_by(town, id) %>%   filter(n() == 5) %>%   mutate(the_rank  = rank(-value, ties.method = "random")) %>%   filter(the_rank > 1 & the_rank < 5) %>%   summarise(mean_value = mean(value)) 
 
 
0
 
vote

De acuerdo, con la ayuda de todos, pude llegar a esta solución:

install.packages ("ncmisc") Biblioteca (ncmisc)

Función para caer min & amp; Max de una lista de números, y devolver el promedio

  Name2  

Crear nuevas columnas para promedios

  Name3  

Bucle a través de filas de cuadro de datos "DATOS"

DROPS MIN & AMP; Los valores máximos, los promedian, pone AVG en otra columna en el marco de datos

  Name4  
 

Okay, with everyone's help I was able to get to this solution:

install.packages("NCmisc") library(NCmisc)

Function to drop min & max of a list of numbers, and return average

drop_avg = function(v){   new = v[v != max(v) & v!= min(v)] # remove min & max   avg = mean(new)   return(avg)  } 

Create new columns for averages

data$avg_E_Inner_R = NA  data$avg_E_Inner_L = NA data$avg_M_Inner_R = NA data$avg_M_Inner_L = NA  

Loop through rows of data frame "data"

Drops min & max values, averages them, puts avg in another column in data frame

for (row in 1:nrow(data)){   E_Inner_R = data[row, c("E_Inner_R_Arm_1","E_Inner_R_Arm_2","E_Inner_R_Arm_3","E_Inner_R_Arm_4","E_Inner_R_Arm_5")]    data[row,]$avg_E_Inner_R = drop_avg(E_Inner_R)    E_Inner_L = data[row, c("E_Inner_L_Arm_1","E_Inner_L_Arm_2","E_Inner_L_Arm_3","E_Inner_L_Arm_4","E_Inner_L_Arm_5")]   data[row,]$avg_E_Inner_L = drop_avg(E_Inner_L)      M_Inner_R = data[row, c("M_Inner_R_Arm_1","M_Inner_R_Arm_2","M_Inner_R_Arm_3","M_Inner_R_Arm_4","M_Inner_R_Arm_5")]   data[row,]$avg_M_Inner_R = drop_avg(M_Inner_R)      M_Inner_L = data[row, c("M_Inner_L_Arm_1","M_Inner_L_Arm_2","M_Inner_L_Arm_3","M_Inner_L_Arm_4","M_Inner_L_Arm_5")]   data[row,]$avg_M_Inner_L = drop_avg(M_Inner_L) } 
 
 

Relacionados problema

1  Filtrando cada columna de un marco de datos un PUT NA para valores inigualables  ( Filtering each column of a data frame an put na for unmatched values ) 
Tengo una tabla de la siguiente manera: [,1] [,2] [,3] [,4] [,5] [1,] a A 0.06 0.31 -1.5 [2,] b B -0.75 0.2 0.02 [3,] ...

96  Cómo explotar una lista dentro de una celda de datos de datos en filas separadas  ( How to explode a list inside a dataframe cell into separate rows ) 
Estoy buscando convertir una célula PANDAS que contiene una lista en filas para cada uno de esos valores. Entonces, toma esto: Si me gustaría desempaca...

1  Pandas DataFrame al diccionario con tuplas como clave y valores  ( Pandas dataframe to dictionary with tuples as key and values ) 
Necesito ayuda para hacer lo siguiente: Tengo un archivo CSV como lo siguiente, cargado en un Frame 'DF'. Hay varias regiones, diferentes valores para la me...

2  Cambiar filas en pandas  ( Change rows in pandas ) 
Tengo una matriz en marco de datos de Pandas print dfMatrix 0 1 2 3 4 0 10000 10 8 11 10 1 10 100000 ...

1  ¿Puedes usar Pandas Groupby para agrupar filas, determinado sumando un valor de columna?  ( Can you use pandas groupby to group rows determined by summing a column value ) 
Me gustaría agrupar filas en un contexto de datos por valores de una columna. El ejemplo dado a continuación sería si estuviera agrupando los valores de 'Numb...

1  Cambio de entradas en un fotograma de datos dependiendo de si están entre dos valores o por debajo de un valor  ( Changing entries in a dataframe depending on whether they are between two values ) 
Tengo un conteo de datos con la distancia en una columna y puntuaciones en otra columna, por ejemplo. Distance Scores 1000. 1 1500. 1 etc. Teng...

12  Deshacerse de las filas con atributos duplicados en r  ( Get rid of rows with duplicate attributes in r ) 
Tengo un gran contorno de datos con columnas tales como: ID, time, OS, IP Cada fila de ese flujo de datos corresponde a una entrada. Dentro de ese prot...

1  R - Quiero que el nombre de la línea de datos sea determinada por un argumento de línea de comandos  ( R i want data frame name to be determined by a command line argument ) 
Quiero que se determine un nombre de marco de datos por un argumento de línea de comandos. Lo siguiente debería dejarlo claro lo que estaba tratando de hacer ...

0  Fusionar con el minuto más cercano usando Pandas  ( Merge with the nearest minute using pandas ) 
Simplemente quiero fusionar dos cuadros de datos dentro de ± 1 min. AQUÍ NAME_DF con el conjunto de datos de muestra: Name Date A 2/19/2019 17:1...

4  Usando RBIND () para combinar múltiples marcos de datos en uno de los datos más grandes.Frame dentro de LAPLY ()  ( Using rbind to combine multiple data frames into one larger data frame within ) 
Estoy usando R-Studio 0.99.491 y R versión 3.2.3 (2015-12-10). Soy un relative Newbie a R, y apreciaría algo de ayuda. Estoy haciendo un proyecto donde estoy ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos