如何基于位置查找特定列的平均值

3

你好,我正在尝试想出一种方法,根据数据框中列的位置,找到特定列的行均值。所涉及的数据框如下所示。

dput(head(df)):

structure(list(UUO_miRNA_O.1 = c(7.32066744158959, 3.31345009504282
), UUO_miRNA_O.2 = c(7.43053887142984, 3.23035600235404), UUO_miRNA_O.3 = c(7.68570216473529, 
3.29381316430644), UUO_miRNA_3.1 = c(7.34325738531531, 3.67473069667518
), UUO_miRNA_3.2 = c(7.3048971830047, 3.69280901141072), UUO_miRNA_3.3 = c(7.41661827643479, 
3.06893743175378), UUO_miRNA_3.4 = c(7.43802624369909, 3.43504336111569
), UUO_miRNA_7.1 = c(7.10631159462831, 3.72163460891437), UUO_miRNA_7.2 = c(6.81674699622009, 
3.89466659628421), UUO_miRNA_7.3 = c(6.78711965034826, 3.94771804243868
), UUO_miRNA_7.4 = c(6.54435389593729, 4.14166831423149), UUO_miRNA_14.1 = c(6.84918460025062, 
3.85693219667159), UUO_miRNA_14.2 = c(6.68019422109324, 3.69409920554401
), UUO_miRNA_14.3 = c(6.40959585449136, 3.64231329240453), UUO_miRNA_14.4 = c(6.59104287861439, 
3.64138476787772)), row.names = c("mmu-let-7a-1-3p", "mmu-let-7a-2-3p"
), class = "data.frame")

数据的复制次数不同。我想知道一种获取每个实验类型中每个基因行均值的方法。

目前,我正在使用这种代码类型来获取我的理想输出。

apply(df[1:3], 1, mean)
apply(df[4:7], 1, mean)
apply(df[8:11], 1, mean)
apply(df[12:15], 1, mean)

我尝试将这个代码转换为循环,但由于重复次数不一致,效果不是很好。此外,这段代码也不是很友好,如果有R语言中的方法或函数可以建议,我会非常感激。

2个回答

3
你可以尝试使用sub来删除点号后面的名称。循环遍历新的唯一名称,并计算与每个名称匹配的数据帧子集的rowMeans,即:
sapply(unique(sub('\\..*', '', names(df))), function(i) rowMeans(df[grepl(i, names(df))]))

#                UUO_miRNA_O UUO_miRNA_3 UUO_miRNA_7 UUO_miRNA_14
#mmu-let-7a-1-3p    7.478969     7.37570    6.813633     6.632504
#mmu-let-7a-2-3p    3.279206     3.46788    3.926422     3.708682

1
那个很好地运作了。 '\..*' 意味着它在 '.' 处分割,对吗?需要添加注释以防忘记这段代码的作用。 - Krutik
1
没错。我添加了一个解释。 - Sotos
1
我执行了sapply(split.default(df, sub(".*_(.*)\\..*", "\\1", names(df))), rowMeans) - Ronak Shah
@RonakShah 不奇怪:D 我在split.defaultsapply之间犹豫不决。 - Sotos
@RonakShah split.default方法可行,但它也重新排列了输出顺序为14、3、7、0。而Sub方法保留了原始列顺序。 - Krutik

2

Something like:

vec_start <- c(1, 4, 8, 12)
vec_end <- c(3, 7, 11, 15)

mapply(function(x, y) rowMeans(df[seq(x, y)]), vec_start, vec_end)

#                   [,1]    [,2]     [,3]     [,4]
#mmu-let-7a-1-3p 7.478969 7.37570 6.813633 6.632504
#mmu-let-7a-2-3p 3.279206 3.46788 3.926422 3.708682

嗨,这也很好用。它考虑了列的位置,所以我认为这个回答精确地回答了给定的问题。 - Krutik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接