如何在不知道前面的重复次数的情况下计算同一样本的重复实验值的平均值?
How to calculate the average of experimental values of replicates of the same sample, without knowing the number of replicates ahead?
我有一个 csv 文件,其中包含许多样本的实验值数据集,有时还会复制同一样本。对于重复,我只考虑属于同一样本的重复的平均值。问题是,重复的数量不同,可以是 2、3、4 等...
我的代码不正确,因为它应该仅在重复数为 2 时才有效(因为我使用循环将一个 sampleID 与循环中的前一个 sampleID 进行比较)。另外,我的代码不起作用,它为我的所有样本添加了相同的平均值,这是不对的。我认为循环开始时也存在问题。因为当x=1时,x-1=0不对应任何值,所以可能导致代码无法运行?
我是 R 的初学者,我从来没有参加过任何课程或培训,我正在接受培训以自学,所以在此先感谢您的帮助。
我的数据集:
预期输出:
PS:在此示例中,重复次数为 2。但是,它可能因样本而异,有时为 2,有时为 3、4 等...
for (x in length(dat$Sample)){
if (dat$Sample[x]==dat$Sample[x-1]){
dat$Average.OD[x-1] <- mean(dat$OD[x], dat$OD[x-1])
dat$Average.OD[x] <- NA
}
}
您可以使用 aggregate
和 merge
在没有任何循环的情况下执行此操作。由于你没有提供任何数据,我用一个简单的例子来说明。
## Example data
set.seed(123)
Sample = round(runif(10), 1)
OD = sample(4, 10, replace=T)
dat = data.frame(OD, Sample)
Means = aggregate(dat$Sample, list(dat$OD), mean, na.rm=T)
names(Means) = c("OD", "mean")
Means
OD mean
1 1 0.9000000
2 2 0.7000000
3 3 0.3666667
4 4 0.4000000
merge(dat, Means, "OD")
OD Sample mean
1 1 0.9 0.9000000
2 1 0.9 0.9000000
3 2 0.8 0.7000000
4 2 0.9 0.7000000
5 2 0.4 0.7000000
6 3 0.0 0.3666667
7 3 0.6 0.3666667
8 3 0.5 0.3666667
9 4 0.3 0.4000000
10 4 0.5 0.4000000
让我向您展示 data.table 的可能解决方案。
#Data
data <- data.frame('Sample'=c('Blank','Blank','STD1','STD1'),
'OD'=c(0.07,0.08,0.09,0.10))
#Code
#Converting our data to data.table.
setDT(data)
#Finding the average of OD by Sample Column. Here Sample Column is the key.If you want it by both Sample and Replicates, pass both of them in by and so on.
data[, AverageOD := mean(OD), by = c("Sample")]
#Turning all the duplicate AverageOD values to NA.
data[duplicated(data, by = c("Sample")), AverageOD := NA]
#Turning column name of AverageOD to Average OD
names(data)[which(names(data) == "AverageOD")] = 'Average OD'
如果您有任何问题,请告诉我。
我有一个 csv 文件,其中包含许多样本的实验值数据集,有时还会复制同一样本。对于重复,我只考虑属于同一样本的重复的平均值。问题是,重复的数量不同,可以是 2、3、4 等...
我的代码不正确,因为它应该仅在重复数为 2 时才有效(因为我使用循环将一个 sampleID 与循环中的前一个 sampleID 进行比较)。另外,我的代码不起作用,它为我的所有样本添加了相同的平均值,这是不对的。我认为循环开始时也存在问题。因为当x=1时,x-1=0不对应任何值,所以可能导致代码无法运行? 我是 R 的初学者,我从来没有参加过任何课程或培训,我正在接受培训以自学,所以在此先感谢您的帮助。
我的数据集:
预期输出:
PS:在此示例中,重复次数为 2。但是,它可能因样本而异,有时为 2,有时为 3、4 等...
for (x in length(dat$Sample)){
if (dat$Sample[x]==dat$Sample[x-1]){
dat$Average.OD[x-1] <- mean(dat$OD[x], dat$OD[x-1])
dat$Average.OD[x] <- NA
}
}
您可以使用 aggregate
和 merge
在没有任何循环的情况下执行此操作。由于你没有提供任何数据,我用一个简单的例子来说明。
## Example data
set.seed(123)
Sample = round(runif(10), 1)
OD = sample(4, 10, replace=T)
dat = data.frame(OD, Sample)
Means = aggregate(dat$Sample, list(dat$OD), mean, na.rm=T)
names(Means) = c("OD", "mean")
Means
OD mean
1 1 0.9000000
2 2 0.7000000
3 3 0.3666667
4 4 0.4000000
merge(dat, Means, "OD")
OD Sample mean
1 1 0.9 0.9000000
2 1 0.9 0.9000000
3 2 0.8 0.7000000
4 2 0.9 0.7000000
5 2 0.4 0.7000000
6 3 0.0 0.3666667
7 3 0.6 0.3666667
8 3 0.5 0.3666667
9 4 0.3 0.4000000
10 4 0.5 0.4000000
让我向您展示 data.table 的可能解决方案。
#Data
data <- data.frame('Sample'=c('Blank','Blank','STD1','STD1'),
'OD'=c(0.07,0.08,0.09,0.10))
#Code
#Converting our data to data.table.
setDT(data)
#Finding the average of OD by Sample Column. Here Sample Column is the key.If you want it by both Sample and Replicates, pass both of them in by and so on.
data[, AverageOD := mean(OD), by = c("Sample")]
#Turning all the duplicate AverageOD values to NA.
data[duplicated(data, by = c("Sample")), AverageOD := NA]
#Turning column name of AverageOD to Average OD
names(data)[which(names(data) == "AverageOD")] = 'Average OD'
如果您有任何问题,请告诉我。