我有一个数据框,我想根据某些条件计算行数,
例如:
df=
rownames A1 A2 A3 B1 B2 B3
r1 1 2 3 4 5 6
r2 1 2 3 4 5 6
r3 1 2 3 4 5 6
treatment= factor(rep(c("A","B"),each=3))
我想根据治疗因素水平得到每一行的方法,数据如下:
rownames A B
r1 2 5
r2 2 5
r3 2 5
对此有何想法?
答案 0 :(得分:0)
我们可以使用melt
中的data.table
执行此操作。 measure
参数可以将多个patterns
转换为'long'格式,按'rownames'分组并指定.SDcols
中的列,循环遍历Data.table的子集({{ 1}})并获取.SD
mean
注意:输出为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
),如OP输出中所示
另一个选项是来自setDF
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
答案 1 :(得分:0)
在使用grep
的基础R中:
sapply(levels(treatment), function(a) rowMeans(df[,grep(a, names(df))]))
# A B
#[1,] 2 5
#[2,] 2 5
#[3,] 2 5