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

列名称以特定字符串(R)结尾的列中的行总和,r,dataframe,sum,multiple-columns,rows,R,Dataframe,Sum,Multiple Columns,Rows,我使用下面的代码,它计算每个子组的z分数。我想在末尾再添加一列,对z分数进行求和,这样所有以“_zscore”结尾的列中所有值的行式求和。我如何具体选择这些列 (请注意,我的真实数据有更多的列,因此我希望在列名中特别选择“zscore”。) 库(dplyr) 种子集(12345) df1=数据帧(a=c(代表(“a”,8),代表(“b”,5),代表(“c”,7),代表(“d”,10)), b=rnorm(30,6,2), c=rnorm(30,12,3.5), d=rnorm(30,8,3) )

我使用下面的代码,它计算每个子组的z分数。我想在末尾再添加一列,对z分数进行求和,这样所有以“_zscore”结尾的列中所有值的行式求和。我如何具体选择这些列

(请注意,我的真实数据有更多的列,因此我希望在列名中特别选择“zscore”。)

库(dplyr)
种子集(12345)
df1=数据帧(a=c(代表(“a”,8),代表(“b”,5),代表(“c”,7),代表(“d”,10)),
b=rnorm(30,6,2),
c=rnorm(30,12,3.5),
d=rnorm(30,8,3)
)
df1_z%
组别(a)%>%
mutate(跨越(b:d,list(zscore=~as.numeric(scale(.')))))

您可以使用
选择
来选择以
“zscore”
结尾的列,并使用
行和

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
库(dplyr)
df1%>%
组别(a)%>%
变异(跨越(b:d,list(zscore=~as.numeric(scale)(.щщ))%>%
解组%>%
mutate(总计=行和(选择(,以('zscore'))结尾)
#一个tibble:30x8
#a b c d b_z核心c_z核心d_z核心总计
#                    
#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
#…还有20行

这是一个data.table解决方案

它基本上与Ronak回答的代码相同,但是在
data.table
语法中

解释
setDT(df1_z)
用于将
df1_z
设置为数据表格式
total:=rowsumes(.SD)
创建一个新列
total
,该列的值为
.SD
(一组选定列)
.SDcols=patterns(“zscore$”)
定义
.SD
的选定列。这里是名称与regex模式
\u zscore$
匹配的列(这意味着:以
\u zscore
结尾)


太棒了!非常感谢您的快速回复,Ronak!:)非常快的回答:)Ronak,你能解释一下这行关于变异的内容吗?另外,我不是R方面的新手,但总是想知道点登录函数的含义是什么?在实践中从未遇到过这种情况。
cross
用于将相同的函数应用于多个列(此处为
b
d
)。这里我们将按列缩放值
~
是在
tidyverse
中使用的公式样式语法,它是匿名函数的替代方法<代码>表示列的值。很好!谢谢!:)
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
library( data.table )
setDT(df1_z)[, total := rowSums(.SD), .SDcols = patterns("_zscore$")]