如何在三列上平均一行

时间:2014-08-05 04:54:15

标签: r

我确信这很简单,但我是R的新手(比如新的30分钟)并且还在摸不着头脑。

我有五列。我想通过a和b列的复合(a是染色体,b是locus)对数据进行排序,然后对sample1,sample2和sample3列的值进行平均,以提供文本输出。

到目前为止,我有以下内容,但我认为我的计算方法是让我失望

#Import the data as a data frame
df = read.table("mydata.txt")

#Make sure its there
summary(df)

#Make sure data is sorted by chromosome and by locus.

df = df[order(df[[1]], df[[2]]), ]
#Take the control samples and average each row for three columns excluding the first two     columns- add the per row means to the data frame

dfmns <- rowMeans( df[ , c("sample1", "sample2", "sample3")] ) 

样本数据如下:

chr leftPos strand  JWA JWB JWC JWD OE33_F
chr1    100202137   +   2   0   1   0   0
chr1    100260304   -   141 62  75  55  20
chr1    100724039   -   0   1   0   0   0

我想

chr      leftPos    strand  JWA JWB JWC JWD OE33_F   Means
chr1    100202137   +          2    0   1   0   0     0.6
chr1    100260304   -        141    62  75  55  20    70.6
chr1    100724039   -          0    1   0   0   0     0.2

我认为代码落在了订单函数上,因为我可能没有正确引用列?

1 个答案:

答案 0 :(得分:1)

您可能已经使用了一些character列来计算rowMeans。在您的示例中,如果要删除字符列/不要选择的列(此处它们位于1,2和3位置)

df$Means <- rowMeans(df[,-(1:3)]) #1:3 refers to the columns `chr` to `strand`
 df
#   chr   leftPos strand JWA JWB JWC JWD OE33_F Means
#1 chr1 100202137      +   2   0   1   0      0   0.6
#2 chr1 100260304      - 141  62  75  55     20  70.6
#3 chr1 100724039      -   0   1   0   0      0   0.2

如果您只有有限数量的列来执行平均值:

rowMeans(df[,c("JWA", "JWB", "JWC","JWD", "OE33_F")])
#[1]  0.6 70.6  0.2

或者

rowMeans(df[grep("^JW|^OE", colnames(df))])
#[1]  0.6 70.6  0.2