es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear una nueva columna (usando mutate de dplyr) basada en condiciones aplicadas en todo el dataframe encadenado

Estoy buscando una forma de crear una nueva columna (usando mutate de dplyr) basada en ciertas “condiciones”.

biblioteca(tidyverse)

qq <- 5

df <- data.frame(rn = 1:qq,
a = rnorm(qq,0,1),
b = rnorm(qq,10,5))

mi_fun <- function(dataframe, valor){ resultado <- dataframe %>%
filter(rn<=valor) %>%
nrow
return(resultado)
}

El ejemplo anterior es una versión simplificada para el cual estoy intentando filtrar el dataframe (df) piped y obtener una nueva columna (foo) cuyos valores describan cuántas filas hay con rn menor o igual que el rn actual (cada rn de la fila – procedente del df piped). A continuación se muestra la salida que estoy obteniendo frente a la que espero obtener:

df %>%
mutate(
foo_que_estoy_obteniendo = mi_fun(.,rn),
foo_esperado = 1:qq)

     rn          a         b foo_que_estoy_obteniendo foo_esperado

1 1 -0.5403937 -4.945643 5 1
2 2 0.7169147 2.516924 5 2
3 3 -0.2610024 -7.003944 5 3
4 4 -0.9991419 -1.663043 5 4
5 5 1.4002610 15.501411 5 5

El cálculo real que estoy intentando realizar es más complicado, sin embargo, si resuelvo la versión simplificada anterior, creo que puedo manejar el resto de la manipulación/cálculos dentro de la función personalizada.

PREGUNTA BONUS: Actualmente, el nombre de la columna en la que quiero aplicar el filtro (es decir, rn) está codificado en la función personalizada (filter(rn<=valor)). Sería genial si esto fuera un argumento de la función personalizada, para que se pase al estilo ‘tidyverse’, es decir, sin comillas – por ejemplo, mi_fun <- function(dataframe,rn,valor)

Descargo de responsabilidad: He hecho todo lo posible para describir el problema en cuestión, sin embargo, si aún hay puntos poco claros, por favor hágamelo saber para que pueda elaborar más.

¡Gracias de antemano por su apoyo!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar la función mutate para crear una nueva columna basada en ciertas condiciones. El siguiente ejemplo es una versión simplificada de lo que intenta hacer:

    library(tidyverse)
    
    qq <- 5
    
    df <- data.frame(rn = 1:qq,
                   a = rnorm(qq,0,1),
                   b = rnorm(qq,10,5))
    
    myf <- function(dataframe,value){
          result <- dataframe %>% 
            filter(rn<=value) %>% 
            nrow
          return(result)
        }
    
    df %>% 
          mutate(
            foo_obtenido = myf(.,rn),
            foo_esperado = 1:qq)
    

    El resultado que obtiene es diferente al que espera obtener.

    Para la pregunta bonus, puede pasar el nombre de la columna como un argumento de la función personalizada sin comillas. Por ejemplo:

    myf <- function(dataframe,rn,value){
          result <- dataframe %>% 
            filter(rn<=value) %>% 
            nrow
          return(result)
        }
    

Comments are closed.