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.

Crear una nueva columna en un dataframe en R que condicione los valores de las filas sin la necesidad de iterar.

Supongamos que tengo el siguiente dataframe “df”:

names <- c("Bob","Mary","Ben","Lauren")
number <- c(1:4)
age <- c(20,33,34,45)
df <- data.frame(names,number,age)

Digamos que tengo otro dataframe (“df2”) con miles de personas y quiero sumar los ingresos de las personas en ese otro dataframe que tengan el nombre, número y edad dados de cada fila en “df”. Es decir, para cada fila “i” de “df”, quiero crear una cuarta columna “TotalIncome” que sea la suma de los ingresos de todas las personas con el nombre, edad y número dados en el dataframe “df2”. En otras palabras, para cada fila “i”:

df$TotalIncome[i] <- sum(
  df2$Income[df2$Name == df1$Name[i] &
  df2$Numbers == df1$Numbers[i] &
  df2$Age == df1$Age[i]], na.rm=TRUE)

¿Hay alguna manera de hacer esto sin tener que iterar en un bucle for para cada fila “i” y realizar el código anterior? ¿Hay alguna manera de usar apply() para calcular esto para todo el vector en lugar de iterar cada línea individualmente? El conjunto de datos real con el que estoy trabajando es enorme y hacer la iteración lleva bastante tiempo, así que espero que haya una manera más eficiente de hacer esto en R.

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de hacer esto sin iterar a través de un bucle for para cada fila. Puedes usar la función apply() para aplicar una función a cada fila o columna de una matriz, array o dataframe. En este caso, podemos usar apply() para aplicar una función personalizada a cada fila de df que sume los ingresos de todas las personas con el nombre, edad y número dados en df2. Aquí tienes un código de ejemplo que muestra cómo hacer esto:

    # definir una función personalizada para sumar los ingresos de las personas con el nombre, número y edad dados
    sumar_ingresos <- function(nombre, numero, edad, df2) {
      sum(df2$Ingresos[df2$Nombre == nombre & df2$Numeros == numero & df2$Edad == edad], na.rm = TRUE)
    }
    
    # crear una cuarta columna TotalIngresos usando la función apply()
    df$TotalIngresos <- apply(df, 1, function(x) sumar_ingresos(x[1], x[2], x[3], df2))
    

    En este código, primero definimos una función personalizada sumar_ingresos() que toma cuatro argumentos: nombre, número, edad y df2. La función utiliza estos argumentos para filtrar el dataframe df2 y sumar la columna de Ingresos de todas las filas que coincidan con el nombre, número y edad dados.

    Para crear la columna TotalIngresos en df, utilizamos la función apply() de la siguiente manera:
    – El primer argumento de apply() es el dataframe df.
    – El segundo argumento 1 especifica que queremos aplicar la función a cada fila del dataframe.
    – El tercer argumento es una función que toma un único argumento x, que representa una fila del dataframe. Dentro de la función, llamamos a sumar_ingresos() con los valores de las columnas Nombre, Numeros y Edad de la fila de entrada x y el dataframe df2.

    Al usar apply() en lugar de iterar a través de un bucle for, podemos evitar iterar por cada fila del dataframe una a la vez, lo cual puede generar ahorros significativos de tiempo para conjuntos de datos grandes.

Comments are closed.