varias superponer sumar suma studio operaciones lineas graficos graficas entre condicional columnas r sum lapply

superponer - R: ¿Cómo sumar varias columnas de marcos de datos en una lista?



superponer graficas en r (2)

Quiero sumar varias columnas de marcos de datos en una lista y solo mostrar la suma sin mostrar las columnas de entrada (cálculo). Aquí un ejemplo:

ls <- list(data.frame(a=1, b=5, c=3, d=2), data.frame(a=NA, b=2, c=7, d=9)) ls [[1]] a b c d 1 1 5 3 2 [[2]] a b c d 1 NA 2 7 9

mi resultado esperado es:

ls2 [[1]] c new 1 3 8 [[2]] c new 1 7 11

¿Alguna idea de como hacer esto? Hasta ahora intenté mejorar esta respuesta para las listas, sin éxito y sin omitir las columnas de entrada (a, b, d). Lo intenté hasta ahora por lapply:

lapply(ls, function(x) x$e <- rowSums(x[,c("a", "b", "d")], na.rm=T)) and ls$e <- lapply(ls, function(x) rowSums(x[,c("a", "b", "d")], na.rm=T))

Gracias de antemano

Editar : Gracias Aech y Abdou por sus respuestas, que funcionan bien con este ejemplo. Sin embargo, tengo> 200 columnas, ¿conoces un camino sin escribir las columnas que quedarán? Me gusta eliminar las columnas que uso para el cálculo, en lugar de nombrar todas las columnas.

EDIT 2: Gracias por su código mejorado, funciona bien con los datos de ejemplo. Sin embargo, con mi verdadero conjunto de datos no ... recibo el siguiente error:

Error in rowSums(x[, columns_to_sum], na.rm = T) : ''x'' must be an array of at least two dimensions"

Mi lista tiene aproximadamente 96 matrices con 200 columnas y una fila. Pero no sé cómo preparar un ejemplo reproducible de mi error. ¿Algunas ideas?


No debe nombrar su lista ls , porque ls es una función.

lapply(myList, function(x) data.frame(c=x$c, new = rowSums(x[,c("a", "b", "d")], na.rm=T)))

Aquí hay una solución en la que solo especifica las columnas descartadas (después de la edición):

dropped <- c("a", "b", "d") lapply(myList, function(x) { x$new <- rowSums(x[,dropped], na.rm=T) x[!names(x) %in% dropped] })


Tratar:

lapply(ls, function(x) { x$new <- rowSums(x[,c("a", "b", "d")], na.rm=T) return(x[,c("c","new")]) })

Editar:

Puede poner las columnas en las que desea utilizar rowSums en una variable de la siguiente manera:

lapply(ls, function(x) { columns_to_sum <- c("a", "b", "d") x$new <- rowSums(x[,columns_to_sum], na.rm=T) return(x[,!colnames(x) %in% columns_to_sum]) })

Aquí columns_to_sum es la variable que guarda los nombres de las columnas sobre las que desea aplicar rowSums .

Espero que esto ayude.