R 跨列的摘要统计信息,其中列名表示组
数据框have包含数千个遵循命名模式的向量。每个向量名称包括一个名词,然后是R 跨列的摘要统计信息,其中列名表示组,r,loops,dplyr,data-manipulation,summary,R,Loops,Dplyr,Data Manipulation,Summary,数据框have包含数千个遵循命名模式的向量。每个向量名称包括一个名词,然后是\u a、\u b或\u c。以下是前10个VAR和OB: id turtle_a banana_a castle_a turtle_b banana_b castle_b turtle_c banana_c castle_c A -0.58 -0.88 -0.56 -0.53 -0.32 -0.42 -0.52
\u a
、\u b
或\u c
。以下是前10个VAR和OB:
id turtle_a banana_a castle_a turtle_b banana_b castle_b turtle_c banana_c castle_c
A -0.58 -0.88 -0.56 -0.53 -0.32 -0.42 -0.52 -0.89 -0.72
B NA NA NA -0.84 -0.36 -0.26 NA NA NA
C 0.00 -0.43 -0.75 -0.35 -0.88 -0.14 -0.26 -0.15 -0.81
D -0.81 -0.63 -0.77 -0.82 -0.83 -0.50 -0.77 -0.25 -0.07
E -0.25 -0.33 -0.09 -0.51 -0.27 -0.81 -0.06 -0.23 -0.97
F -0.80 -0.88 -0.05 NA NA NA NA NA NA
G -0.25 -0.76 -0.21 NA NA NA NA NA NA
H -0.47 -0.10 -0.67 -0.46 -0.71 -0.24 -0.76 -0.04 -0.11
I -0.15 -0.34 -0.57 -0.40 -0.14 -0.49 NA NA NA
J -0.65 -0.86 -0.37 -0.67 -0.81 -0.63 NA NA NA
数据框want
是名词组中每一组变量的所有列的平均值。例如,对于id
=a
,海龟b
和海龟c
的平均值等于-0.54
。如果我只对示例中的少数名词组执行此操作,want
看起来就是这样
id turtle_m banana_m castle_m
A -0.54 -0.70 -0.57
B -0.84 -0.36 -0.26
C -0.20 -0.49 -0.57
D -0.80 -0.57 -0.45
E -0.27 -0.28 -0.62
F -0.80 -0.88 -0.05
G -0.25 -0.76 -0.21
H -0.56 -0.29 -0.34
I -0.27 -0.24 -0.53
J -0.66 -0.83 -0.50
迄今为止的选择:
dplyr
中的groupby()
函数转换为long,summary
,并转换回widesummary\u at
或summary\u all
可以比我当前的任何一个选项更有效地使用,但我不确定如何使用它,通过命名约定对变量进行动态分组
有什么想法吗?我们可以使用
split。默认情况下
根据列名的子字符串拆分列,使用sapply
使用rowMeans
循环列表
,然后使用cbind
循环第一列
out <- cbind(df1[1], sapply(split.default(df1[-1],
sub("_.*", "", names(df1)[-1])), rowMeans, na.rm = TRUE))
以前从未听说过split.default()。很酷,可以看到一个基础和一个tidyverse解决方案
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -id, names_sep="_", names_to = c(".value", "group")) %>%
group_by(id) %>%
summarise(across(turtle:castle, mean, na.rm = TRUE))