Soma linhas em colunas com nomes de coluna terminando com string de caractere específico (R) [duplicado]

Aug 18 2020

Estou usando o código a seguir, que calcula pontuações z por subgrupo. Eu gostaria de adicionar mais uma coluna no final, que soma as pontuações z, portanto, somas por linha de todos os valores em todas as colunas que terminam com "_zscore". Como posso selecionar especificamente essas colunas?

(Observe que meus dados reais têm muito mais colunas, então estou procurando selecionar especificamente "_zscore" nos nomes das colunas.)

 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(.)))))

Respostas

4 RonakShah Aug 18 2020 at 05:28

Você pode usar use selectpara selecionar colunas que terminam com "zscore"e usar 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

aqui está uma solução data.table

Ele basicamente faz o mesmo que o código da resposta de Ronak, mas na data.tablesintaxe.

explicação
setDT(df1_z)é usada para definir df1_zpara um formato data.table
total := rowSums(.SD)cria uma nova coluna total, que tinha o valor de rowSumsde .SD(um conjunto de colunas selecionadas)
.SDcols = patterns("_zscore$")define as colunas selecionadas para .SD. Aqui, são as colunas cujo nome corresponde ao padrão regex _zscore$(que significa: terminando com _zscore)

library( data.table )
setDT(df1_z)[, total := rowSums(.SD), .SDcols = patterns("_zscore$")]