R中某些行的平均值

时间:2014-10-31 12:52:05

标签: r average

在使用数据框表时,我还没有找到一种方法在R中的SOME列中取平均值。基本上,我想取3个控件的平均值(CTR_R1 + CTR_R2 + CTR_R3)并在CTR_R3之后插入该值作为另一个列(见下文)。 TRT也是如此。 是否需要取平均值并将其插入特定位置?

GeneID|CTR_R1|CTR_R2|CTR_R3|CTR_AVG|TRT_R1| TRT_R2| TRT_R3|TRT_AVG|pValue

5 个答案:

答案 0 :(得分:1)

即使有许多CTRTRT列(即100个),以下代码也应该有效。但是,我猜@ beginneR的解决方案更快。

indx <- grep("^CTR", colnames(df1), value=TRUE)
indxT <- grep("^TRT", colnames(df1), value=TRUE)
df1[,c('CTR_Avg', 'TRT_Avg')] <- lapply(list(indx, indxT), 
                    function(x) Reduce(`+`, df1[,x])/length(x))

或者您可以在上面的步骤中使用rowMeans

df2 <- df1[,c('GeneID', indx, 'CTR_Avg', indxT, 'TRT_Avg', 'pValue')]

head(df2,2)
#    GeneID CTR_R1 CTR_R2 CTR_R3  CTR_Avg TRT_R1 TRT_R2 TRT_R3 TRT_Avg pValue
#1      1      6      2     10 6.000000     10     11     15      12  0.091
#2      2      5     12      8 8.333333      5      3     13       7  0.051

数据

set.seed(24)
df1 <- as.data.frame(matrix(sample(1:20,20*6, replace=TRUE), ncol=6))
colnames(df1) <- c("CTR_R1", "CTR_R2", "CTR_R3", "TRT_R1", "TRT_R2", "TRT_R3")
df1 <- cbind(GeneID=1:20, df1, 
            pValue=sample(seq(0.001, 0.10, by=0.01), 20, replace=TRUE))

答案 1 :(得分:1)

如果您的data.frame名为df

,此代码应该适合您
df$CTR_AVG <- ( df$CTR_R1 + df$CTR_R2 + df$CTR_R3 ) / 3

假设CTR_AVG列已经存在,如您在问题中所示。如果没有,代码会将列放在data.frame的末尾。要将其移动到正确的位置,您需要按正确的顺序选择列,如下所示:

df[ , c( 'GeneID', 'CTR_R1', 'CTR_R2', 'CTR_R3', 'CTR_AVG', 'TRT_R1', 'TRT_R2', 'TRT_R3','TRT_AVG','pValue' ] 

答案 2 :(得分:1)

怎么样

df$CTR_AVG <- rowMeans(df[,2:4])
df$TRT_AVG <- rowMeans(df[,6:8])

答案 3 :(得分:0)

制作一些虚拟数据

df=data.frame(CTR_R1=1:10,CTR_R2=1:10,CTR_R3=1:10,somethingelse=1:10)

获取新列

df$CTR_AVG=apply(df[c("CTR_R1","CTR_R2","CTR_R3")],1,mean)

答案 4 :(得分:0)

非常感谢您的回复。对不起,我没有更好地说出原来的问题。我想问一下如何编写一个脚本来取平均值并将该值放在正确的位置。我的表中没有列出&#34; CTR_AVG&#34;的列,也没有列&#34; TRT_AVG&#34;。 我想知道我是否可以做得更好而且优雅地#39;而不是做我在下面做的(这也有效)。

非常感谢。

名称(edgeR_table)

&#34; GeneID&#34; &#34; CTR_R1&#34; &#34; CTR_R2&#34; &#34; CTR_R3&#34; &#34; TRT_R1&#34; &#34; TRT_R2&#34; &#34; TRT_R3&#34; &#34; logFC&#34; &#34; logCPM&#34; &#34; LR&#34; &#34; p值&#34; &#34; FDR&#34;

edgeR_table $ CTR_AVG&lt; - rowMeans(edgeR_table [,2:4])

edgeR_table $ TRT_AVG&lt; - rowMeans(edgeR_table [,5:7])

edgeR_table&lt; - edgeR_table [,c(1,2,3,4,13,5,6,7,14,8,9,10,11,12)]