I have different data.frame objects with two columns. These data.frame objects are called Experiment1, Experiment2, Experiment3 ... Experiment{n}
> Experiment1
Name Statistic
1 a -1.050
2 b 0.058
3 c 0.489
4 d 1.153
5 e 0.736
6 f -1.155
7 g 0.186
> Experiment2
Name Statistic
1 a 0.266
2 b 0.067
3 c -0.385
4 d 0.068
5 e 1.563
6 f 0.745
7 g 1.671
> Experiment3
Name Statistic
1 a 0.004
2 b -2.074
3 c 0.746
4 d 0.207
5 e 0.700
6 f 0.158
7 g 0.067
> Experiment4
Name Statistic
1 a 0.255
2 b -0.542
3 c 0.477
4 d 1.552
5 e 0.025
6 f 1.027
7 g 0.326
> Experiment5
Name Statistic
1 a 1.817
2 b 0.147
3 c 0.052
4 d 0.194
5 e -0.137
6 f 2.321
7 g -0.939
> Experiment6
Name Statistic
1 a 1.817
2 b 0.147
3 c 0.052
4 d 0.194
5 e -0.137
6 f 2.321
7 g -0.939
> ExperimentalDesign$metabolite
[1] "butyrate" "h2s" "hippurate" "acetate" "propionate" "butyrate_2" [7] "h2s_2" "hippurate_2" "acetate_2" "propionate_2"
I have different data.frame objects with three columns. These data.frame objects are called Experiment1, Experiment2, Experiment3 ... Experiment{n} (where n is NumberTubes divided by NumberParameters).
Now I want to merge from each data.frame object the .$Statistic column in a table (3 statistic columns per output..) tab_1 <- cbind(Experiment1, Experiment2$Statistic, Experiment3$Statistic). Also, take the metabolite from ExperimentalDesign$metabolite in order. e.g. Table_3 would get hippurate.
- NumberRepeats <- 3 (Table_1 = merge Experiment_1, Experiment_2$Statistic, Experiment_3$Statistic , Table_2 = merge Experiment_4, Experiment_5$Statistic, Experiment_6$Statistic, etc.)
- Experiment_n <- 17 (e.g. Experiment_1, Experiment_2, etc..)
- skipTube <- c(11) (skip Experiment_11)
Desired outputs:
Table_1:
Experiment1 Experiment2 Experiment3 metabolite
a -1.050 0.266 0.004 butyrate
b 0.058 0.067 -2.074 butyrate
c 0.489 -0.385 0.746 butyrate
d 1.153 0.068 0.207 butyrate
e 0.736 1.563 0.700 butyrate
f -1.155 0.745 0.158 butyrate
g 0.186 1.671 0.067 butyrate
Table_2
Experiment4 Experiment5 Experiment6 metabolite
a 0.255 1.817 -0.827 h2s
b -0.542 0.147 0.219 h2s
c 0.477 0.052 1.561 h2s
d 1.552 0.194 1.493 h2s
e 0.025 -0.137 0.063 h2s
f 1.027 2.321 0.844 h2s
g 0.326 -0.939 -0.373 h2s
TRIED SO FAR:
With this you merge on column of different dataframe objects to one table. You can control the number of column by the NumberRepeats
variable. All table which are stored in a list have same number of data columns like the
NumberRepeats
variable except the last table...
# created test data
for(i in 1:17){
Name <- letters[1:7]
Statistic <- round(rnorm(7), 3)
assign(paste0("Experiment",i), data.frame(Name, Statistic))
}
# set some parameters
NumberRepeats <- 3
Experiment_n <- 17
skipTube <- c(11)
# lets go
out <- list()
list_index <- 1
counter <- 1
while(counter < Experiment_n) {
tab <- NULL
nam <- NULL
while((is.null(tab) || ncol(tab) < NumberRepeats) & Experiment_n >= counter){
if(!any(counter == skipTube)){
tab <- cbind(tab, get(paste0("Experiment", counter))$Statistic)
# tab <- as.data.frame(tab)
nam <- c(nam,paste0("Experiment", counter))
}
counter <- counter + 1
}
colnames(tab) <- nam
rownames(tab) <- as.matrix(Experiment1$Name)
out[[list_index]] <- tab
assign(paste0('table_', list_index), tab)
list_index <- list_index + 1
}
out
Output from above code:
Experiment1 Experiment2 Experiment3
a 0.136 0.260 -1.089
b 0.946 -1.165 -0.599
c -0.462 -1.445 0.044
d -1.936 -0.391 0.622
e 0.537 -0.502 1.192
f 0.259 0.096 -1.873
g 1.352 0.049 -0.644
Desired output from the above code:
Experiment1 Experiment2 Experiment3 metabolite
a -1.050 0.266 0.004 butyrate
b 0.058 0.067 -2.074 butyrate
c 0.489 -0.385 0.746 butyrate
d 1.153 0.068 0.207 butyrate
e 0.736 1.563 0.700 butyrate
f -1.155 0.745 0.158 butyrate
g 0.186 1.671 0.067 butyrate