Sumar filas en columnas cuyos nombres terminen con una cadena de caracteres específica (R) [duplicar]

Aug 18 2020

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

4 RonakShah Aug 18 2020 at 05:28

Puede usar use selectpara 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
2 Wimpel Aug 18 2020 at 06:30

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.tablesintaxis.

explicación
setDT(df1_z)se usa para ajustar df1_za un formato data.table
total := rowSums(.SD)crea una nueva columna total, que tenía el valor de rowSumsde 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$")]