Soma linhas em colunas com nomes de coluna terminando com string de caractere específico (R) [duplicado]
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
Você pode usar use select
para 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
aqui está uma solução data.table
Ele basicamente faz o mesmo que o código da resposta de Ronak, mas na data.table
sintaxe.
explicação
setDT(df1_z)
é usada para definir df1_z
para um formato data.table
total := rowSums(.SD)
cria uma nova coluna total
, que tinha o valor de rowSums
de .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$")]