OpasnetUtils/Merge

From Testiwiki
Jump to: navigation, search



Description

Merge of ovariables merges the 'output' slot by index columns except 'Unit'.

Noista Opasnetin kehityskohteista on nyt yksi nousemassa aika tärkeäksi, ja koska se on periaatteessa pieni juttu, voitko nostaa sen työlistallasi:

Ovariablen merge yhdistää nyt data.framet yksinkertaisesti samannimisten sarakkeiden eli käytännössä indeksien perusteella. Tämä pitäisi toteuttaa siten, että jos lokaatio on tyhjä, se tarkoittaa että lokaatio voi olla mikä tahansa niistä, jotka ko. sarakkeessa ovat käytössä. Käytännössä käsittääkseni tämä kannattaisi toteuttaa näin ovariablelle e1:

  • x <- e1@output
  • Pudotetaan ylimääräiset levelit pois jos sellaisia sattuisi olemaan: x <- dropall(x)
  • Käydään x läpi indeksisarake kerrallaan ja jaetaan x kahteen osaan: siihen, jossa indeksisarakkeen arvo == NA ja siihen jossa ei ole. Edellistä osasta tiputetaan koko indeksisarake pois.
  • Edellinen osa mergetään sellaisen data.framen kanssa, jossa on vain yksi sarake jossa on ko. indeksisarakkeen levelit.
  • Nyt nämä kaksi osaa rbindataan takaisin yhteen.
  • Otetaan seuraava indeksisarake käsittelyyn.

Merge-funktioon tämä liittyy sikäli, että tämä operaatio olisi hyvä tehdä oletusarvoisesti ennen mergeä, ellei sitä ole parametrisoitu pois. Pitäisiköhän tästä tehdä oma S4-funktionsa, jota mergestä kutsuttaisiin?

Tämä koodi nyt puski päästä tämmöisenä, data.framelle sovitettuna:

object <- data.frame(In1 = c(1,2,NA,NA,5), In2 = c(NA, "B", "C", "D", "E"), Result = 11:15)
marginals <- c(1,2)
fillna <- function(object, marginals) {
	a <- dropall(object)
	for(i in marginals) {
		a[[i]] <- as.factor(a[[i]])
		a1 <- a[!is.na(a[[i]]), ]
		a2 <- a[is.na(a[[i]]), ][-i]
		addition <- data.frame(A = levels(a[[i]]))
		colnames(addition) <- colnames(a)[i]
		a2 <- merge(addition, a2)
		a <- rbind(a1, a2)
	}
	return(a)
}

fillna(object, 1)
fillna(object, c(1,2))

Näyttää toimivan. Tärkeä kysymys kuuluu: jos implementoimme jotain tämmöistä, se vaikuttaa kaikkiin mergeihin ja Opseihin, joten pitää olla tarkkana mitä teemme. Liittyykö tähän sivuvaikutuksia?

Code

https://www.opasnet.org/svn/opasnet_utils/trunk/R/Merge.r

See also