列名以特定字符串R结尾的列中的行总和

问题描述

我正在使用以下代码,该代码计算每个子组的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(.)))))

解决方法

您可以使用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
,

这是data.table解决方案

它基本上与Ronak的答案相同,但使用的是data.table语法。

说明
setDT(df1_z)用于将df1_z设置为data.table格式
total := rowSums(.SD)创建一个新列total,其值是rowSums(一组选定列)中的值.SD
.SDcols = patterns("_zscore$")定义了.SD的选定列。在这里,这些列的名称与正则表达式模式_zscore$相匹配(这意味着:以_zscore结尾)

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...