R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Yhdistä monta taulukkoa: merge

Tänään tuli tarve yhdistää monta samanlaista taulukkoa (data.frame) yhdeksi taulukoksi yhden muuttujan perusteella. R:ssä on funktio merge, joka mahdollistaa kahden data.framen yhdistämisen. Useamman taulukon tapauksessa täytyy käyttää looppia tai sisällyttää merge johonkin muuhun R:n funktioon. Tässä pari esimerkkiä miten ongeman saa ratkaistua:

 
#Tehdään esimerkkitaulukot
DF1 <- data.frame(var1 = letters[1:5], a = rnorm(5))
DF2 <- data.frame(var1 = letters[3:7], b = rnorm(5))
DF3 <- data.frame(var1 = letters[6:10], c = rnorm(5))
DF4 <- data.frame(var1 = letters[8:12], d = rnorm(5))
 
#Ensimmäinen tapa: käytetään mergeä useaan kertaan 
#--> ei suositeltava tapa
g <- merge(DF1, DF2, by.x="var1", by.y="var1", all=T)
g <- merge(g, DF3, by.x="var1", by.y="var1", all=T)
merge(g, DF4, by.x="var1", by.y="var1", all=T)
 
#Toinen tapa: yhdistetään esimerkkitaulukot listaan ja 
#ajetaan for silmukasta läpi
my.list <- list(DF2, DF3, DF4)
 
DF <- DF1
for ( .df in my.list ) {
  DF <-merge(DF, .df, by.x="var1", by.y="var1", all=T)
 }
DF
 
#Kolmas tapa: käytetään Reduce-funktiota
my.list <- list(DF1, DF2, DF3, DF4)
 
Reduce(function(x, y) merge(x, y, all=T,by.x="var1", 
by.y="var1"), my.list, accumulate=F)
 
#Jos muuttujien nimet taulukoissa ovat samat, 
#edelliset ratkaisut eivät toimi. Tämä korjaantuu kirjoittamalla 
#merge-lauseen parametriksi suffixes=c("","").
 
DF1 <- data.frame(var1 = letters[1:5], 
a = rnorm(5), b = rnorm(5), c = rnorm(5))
 
DF2 <- data.frame(var1 = letters[3:7], 
a = rnorm(5), b = rnorm(5), c = rnorm(5))
 
DF3 <- data.frame(var1 = letters[6:10], 
a = rnorm(5), b = rnorm(5), c = rnorm(5))
 
DF4 <- data.frame(var1 = letters[8:12], 
a = rnorm(5), b = rnorm(5), c = rnorm(5))
 
DF <- DF1
for ( .df in list(DF2,DF3,DF4) ) {
    DF <- merge(DF, .df, by.x="var1", by.y="var1", all=T, 
    suffixes=c("", ""))
}
DF