我正在尝试通过读取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进行对比。在我的实际工作中,我有更多的重复,更多的输入量,更多的基因和样本。我通过将子集分配给新变量并查找所有子集的平均值来实现它。但它看起来很笨重。任何人有任何更好的建议???
谢谢!
答案 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行的样本数据 希望这会有所帮助。