数据帧have
包含几千个遵循命名模式的向量。每个向量名都包含一个名词,然后是_a
、_b
或_c
。以下是前 10 个变量和 obs:
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
的turtle_a
、turtle_b
和turtle_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
到目前为止的选项:
- 转换为 long,
summarize
dplyr
中带有group_by()
函数,然后转置回宽。 - 重新调整向量,使名词组彼此相邻显示,并编写一个跨列计算平均值的循环,在每次迭代时采取三列步骤
似乎summarize_at
或summarize_all
可以比我当前的任何选项更有效地使用,但我不确定如何以通过命名约定动态分组变量的方式使用它。
有什么想法吗?
我们可以使用split.default
根据列名的子字符串拆分列,使用sapply
rowMeans
遍历list
,然后用第一列cbind
out <- cbind(df1[1], sapply(split.default(df1[-1],
sub("_.*", "", names(df1)[-1])), rowMeans, na.rm = TRUE))
或者我们可以使用pivot_longer
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))