특정 문자열 (R) [duplicate]로 끝나는 열 이름이있는 열의 합계 행

Aug 18 2020

하위 그룹당 z 점수를 계산하는 다음 코드를 사용하고 있습니다. 끝에 열을 하나 더 추가하여 z 점수를 합산하여 "_zscore"로 끝나는 모든 열의 모든 값을 행 단위로 합산하고 싶습니다. 이러한 열을 구체적으로 어떻게 선택할 수 있습니까?

(실제 데이터에는 더 많은 열이 있으므로 열 이름에서 "_zscore"를 구체적으로 선택하려고합니다.)

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

답변

4 RonakShah Aug 18 2020 at 05:28

use를 사용 select하여 다음으로 끝나는 열을 선택 "zscore"하고 다음을 사용할 수 있습니다 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

여기에 data.table 솔루션이 있습니다.

기본적으로 Ronak의 답변 코드와 동일하지만 data.table구문 에서는 동일 합니다.

설명
setDT(df1_z)df1_zdata.table 형식 으로 설정 하는 데 사용됩니다 . (선택한 열 집합)의 값이
total := rowSums(.SD)있는 새 열 은에 대해 선택한 열을 정의합니다 . 여기에서 이름이 정규식 패턴과 일치하는 열입니다 (즉,으로 끝남 ).totalrowSums.SD
.SDcols = patterns("_zscore$").SD_zscore$_zscore

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