R中的子集和平均值

时间:2017-04-05 23:47:01

标签: r dataframe subset

我正在尝试通过读取csv文件来获取数据框中的特定值的子集和平均值。

我有一个包含多个变量的数据框,我想平均不同的子集并使用ggplot将它们相互比较。

虚拟示例:

            Sample input lot gene count 
       1       1    50   6    A    10   
       2       1    50   6    A    11   
       3       1    50   6    B   100  
       4       1    50   6    B   112   
       5       1  1000   7    A    12   
       6       1  1000   7    A    13   
       7       1  1000   7    B   150   
       8       1  1000   7    B   151  
       9       2    50   6    A   660   
       10      2    50   6    A   661   
       11      2    50   6    B  2000   
       12      2    50   6    B  2002   
       13      2  1000   7    A   662   
       14      2  1000   7    A   663   
       15      2  1000   7    B  2250   
       16      2  1000   7    B  2252   

我想要做的是获得每输入样本的平均重复次数,每,每基因即可。所以在这个例子中平均值是:

样品1-输入50-基因A = 10.5

然后我想创建一个新列,其中包含平均输入的平均值,以及“标准”列,在这种情况下为1000.

            Sample input lot gene count avg.each avg.1000
       1       1    50   6    A    10     10.5     12.5
       2       1    50   6    A    11     10.5     12.5
       3       1    50   6    B   100    106.0    150.5
       4       1    50   6    B   112    106.0    150.5
       5       1  1000   7    A    12     12.5     12.5
       6       1  1000   7    A    13     12.5     12.5
       7       1  1000   7    B   150    150.5    150.5
       8       1  1000   7    B   151    150.5    150.5
       9       2    50   6    A   660    660.5    662.5
       10      2    50   6    A   661    660.5    662.5
       11      2    50   6    B  2000   2001.0   2251.0
       12      2    50   6    B  2002   2001.0   2251.0
       13      2  1000   7    A   662    662.5    662.5
       14      2  1000   7    A   663    662.5    662.5
       15      2  1000   7    B  2250   2251.0   2251.0
       16      2  1000   7    B  2252   2251.0   2251.0

那么我可以将avg.each与“标准”avg.1000进行对比。在我的实际工作中,我有更多的重复,更多的输入量,更多的基因和样本。我通过将子集分配给新变量并查找所有子集的平均值来实现它。但它看起来很笨重。任何人有任何更好的建议???

谢谢!

2 个答案:

答案 0 :(得分:2)

我对你的问题有点困惑,但我认为你需要使用包dplyr,如下所示:

# Create example data.frame
df <- data_frame(
   sample = rep(c(1,2), each = 8),
   input  = rep(rep(c(50,1000), each = 4), 2),
   lot    = rep(rep(c(6,7), each = 4), 2),
   gene   = rep(rep(c("A","B"), each = 2), 4),
   count  = sample(100, size = 16)
)

# Average of counts
df1 <- df %>% 
   group_by(sample, input, lot, gene) %>% 
   mutate(avg.each = mean(count))

# Standard average
standard <- 1000
df2 <- df %>% 
   filter(input == standard) %>% 
   group_by(sample, gene) %>% 
   summarize(avg.1000 = mean(count))

# Combine data.frames
df3 <- df1 %>% 
   left_join(df2, by = c("sample", "gene"))

因此,您需要创建两个临时data.frames并使用left_join函数将它们组合在一起。看看临时data.frames,了解我的所作所为。我希望这可以帮到你!

答案 1 :(得分:1)

这是您正在寻找的简化形式:

df<-read.table(header= TRUE, text = "Sample input lot gene count 
              1    50   6    A    10   
              1    50   6    A    11   
              1    50   6    B   100  
              1    50   6    B   112   
              1  1000   7    A    12   
              1  1000   7    A    13   
              1  1000   7    B   150   
              1  1000   7    B   151  
              2    50   6    A   660   
              2    50   6    A   661   
              2    50   6    B  2000   
              2    50   6    B  2002   
              2  1000   7    A   662   
              2  1000   7    A   663   
              2  1000   7    B  2250   
              2  1000   7    B  2252")

library(dplyr)
myave<-df %>% group_by(Sample, input, gene) %>%
  summarize(mcount = mean(count))

library(tidyr)
spread(myave, input, mcount)

总结了最多4行的样本数据 希望这会有所帮助。