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!
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 usarapply()
para aplicar una función personalizada a cada fila dedf
que sume los ingresos de todas las personas con el nombre, edad y número dados endf2
. Aquí tienes un código de ejemplo que muestra cómo hacer esto: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ónapply()
de la siguiente manera:– El primer argumento de
apply()
es el dataframedf
.– 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 asumar_ingresos()
con los valores de las columnas Nombre, Numeros y Edad de la fila de entradax
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.