我们可以使用来自data.table 的melt 来做到这一点。 measure 参数可以采用多个patterns 转换为“长”格式,按“行名”分组并指定.SDcols 中的列,循环遍历Data.table (.SD) 的子集并获取@ 987654327@
library(data.table)
melt(setDT(df), measure = patterns("^A", "^B"), value.name = c('A', 'B'))[,
lapply(.SD, mean), rownames, .SDcols = A:B]
# rownames A B
#1: r1 2 5
#2: r2 2 5
#3: r3 2 5
注意:输出是 data.table,可以转换为 data.frame (setDF),如 OP 的输出所示
另一个选项是split 来自base R
sapply(split.default(df[-1], sub("\\d+", "", names(df)[-1])), rowMeans)
# A B
#[1,] 2 5
#[2,] 2 5
#[3,] 2 5
数据
df <- structure(list(rownames = c("r1", "r2", "r3"), A1 = c(1L, 1L,
1L), A2 = c(2L, 2L, 2L), A3 = c(3L, 3L, 3L), B1 = c(4L, 4L, 4L
), B2 = c(5L, 5L, 5L), B3 = c(6L, 6L, 6L)), .Names = c("rownames",
"A1", "A2", "A3", "B1", "B2", "B3"), class = "data.frame", row.names = c(NA,
-3L))