Sumar filas en columnas cuyos nombres terminen con una cadena de caracteres específica (R) [duplicar]
Estoy usando el siguiente código, que calcula las puntuaciones z por subgrupo. Me gustaría agregar una columna más al final, que suma los puntajes z, por lo tanto, sumas en filas de todos los valores en todas las columnas que terminan con "_zscore". ¿Cómo podría seleccionar específicamente esas columnas?
(Tenga en cuenta que mis datos reales tienen muchas más columnas, por lo que estoy buscando seleccionar específicamente "_zscore" en los nombres de las columnas).
library(dplyr)
set.seed(12345)
df1 = data.frame(a=c(rep("a",8), rep("b",5), rep("c",7), rep("d",10)),
b=rnorm(30, 6, 2),
c=rnorm(30, 12, 3.5),
d=rnorm(30, 8, 3)
)
df1_z <- df1 %>%
group_by(a) %>%
mutate(across(b:d, list(zscore = ~as.numeric(scale(.)))))
Respuestas
Puede usar use select
para seleccionar columnas que terminen con "zscore"
y use rowSums
:
library(dplyr)
df1 %>%
group_by(a) %>%
mutate(across(b:d, list(zscore = ~as.numeric(scale(.))))) %>%
ungroup %>%
mutate(total = rowSums(select(., ends_with('zscore'))))
# A tibble: 30 x 8
# a b c d b_zscore c_zscore d_zscore total
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 a 7.17 14.8 8.45 0.697 0.101 0.0179 0.816
# 2 a 7.42 19.7 3.97 0.841 1.17 -1.14 0.865
# 3 a 5.78 19.2 9.66 -0.108 1.05 0.332 1.28
# 4 a 5.09 17.7 12.8 -0.508 0.732 1.14 1.36
# 5 a 7.21 12.9 6.24 0.721 -0.329 -0.555 -0.163
# 6 a 2.36 13.7 2.50 -2.09 -0.146 -1.52 -3.76
# 7 a 7.26 10.9 10.7 0.749 -0.774 0.593 0.567
# 8 a 5.45 6.18 12.8 -0.302 -1.80 1.14 -0.965
# 9 b 5.43 18.2 9.55 -0.445 1.12 1.34 2.02
#10 b 4.16 12.1 4.11 -1.06 0.0776 -1.02 -2.01
# … with 20 more rows
aquí hay una solución de tabla de datos
Básicamente hace lo mismo que el código de la respuesta de Ronak, pero luego en la data.table
sintaxis.
explicación
setDT(df1_z)
se usa para ajustar df1_z
a un formato data.table
total := rowSums(.SD)
crea una nueva columna total
, que tenía el valor de rowSums
de la .SD
(un conjunto de columnas seleccionadas)
.SDcols = patterns("_zscore$")
define las columnas seleccionadas para .SD
. Aquí, son las columnas cuyo nombre coincide con el patrón de expresiones regulares _zscore$
(lo que significa: termina con _zscore
)
library( data.table )
setDT(df1_z)[, total := rowSums(.SD), .SDcols = patterns("_zscore$")]