Życzenia Noworoczne

Życzę Wszystkim w Nowym Roku 2012 samych rozwiązywalnych problemów i radości z życia, oraz R'a ;)

admin | sobota, 31 grudzień 2011 - 7:40 pm | | Blog-R

Jak poprawnie pisać...

Znalazłem w sieci kilka uwag na temat dobrych zasad pisania kodu w R, warto ZOBACZYĆ.

admin | sobota, 31 grudzień 2011 - 12:32 am | | Blog-R

Pojawiła się nowa wersja Rcmdr

Pojawiła się nowa wersja Rcmdr numer 1.8-1. Poinformował o tym John Fox to the R-pkgs mailing list.

Źródło: R-bloggers

admin | czwartek, 29 grudzień 2011 - 7:19 pm | | Blog-R

Ile miejsc po przecinku ?

Zaszła potrzeba, aby dowiedzieć się ile miejsc po przecinku ma pewna zmienna...

howManyDecimals<-function(x){
	if(!is.numeric(x))
		stop("x must be numeric!")
	return(nchar(unlist(strsplit(as.character(x),'.',fixed=TRUE))[2]))
}

Created by Pretty R at inside-R.org

Jedyną wadą tej funkcji jest ograniczenie wynikające z obcięcia części dziesiętnej liczby przez wykorzystaną funkcję as.character().

admin | środa, 28 grudzień 2011 - 3:08 pm | | Blog-R

Funkcja zaokrąglająca "krokowo"

Przedstawiam prostą funkcję, która zaokrągla liczbę do wartości najbliższego kroku:

roundStep<-function(x, step, start=0){
	if(missing(x)|missing(step))
		stop("Missing argument")
	return(round((x-start)/step)*step+start)
}

Created by Pretty R at inside-R.org

admin | środa, 28 grudzień 2011 - 12:08 pm | | Blog-R

Programistyczne problemy próbkowania

Funkcja sample() może sprawiać pewne problemy jeżeli zostanie niepoprawnie zastosowana w kodzie. Przykład takiego problemu został opisany na stronie R snippets.

I chociaż juz pierwszy komentarz pod postem stwierdza, że jest to problem udokumentowany w pomocy funkcji i zalecana jest nawet funkcja rozwiązująca przedstawione problemy (resample()), to i tak uważam, że warto przeanalizować przynajmniej kod zaprezentowany poniżej (R snippets).

 Zobaczcie różnicę:

for (i in 1:4) {
      x <- i:4
      print(sample(x))
}
#[1] 4 1 2 3
#[1] 3 2 4
#[1] 4 3
#[1] 3 2 1 4

Created by Pretty R at inside-R.org

for (i in 1:4) {
      x <- i:4
      print(x[sample(length(x))])
}
#[1] 4 1 2 3
#[1] 3 2 4
#[1] 3 4
#[1] 4

Created by Pretty R at inside-R.org

Źródło: R-bloggers

admin | poniedziałek, 26 grudzień 2011 - 11:41 pm | | Blog-R

Życzenia

Z Okazji Świąt Bożego Narodzenia składam wszystkim najserdeczniejsze życzenia.

P.S. Z tej okazji przygotowałem dla Was choinkę.

source("http://fork.edu.pl/r/choinka.R")

admin | sobota, 24 grudzień 2011 - 3:14 pm | | Blog-R

Wykresy w R bez znajomości R...

Z pakietem GrapheR opisanym w artykule pt: GrapheR: a Multiplatform GUI for Drawing Customizable Graphs in R przez Maxime Hervé, można tworzyć R'owe wykresy bez jakiej kolwiek znajomości R'a. Jedyne co trzeba zrobić to załadować pakiet i uruchomić poleceniem: <b>run.GrapheR()</b>. Resztę można spokojnie wyklikać.

admin | czwartek, 22 grudzień 2011 - 12:01 am | | Blog-R

Interesująca alternatywa dla Sweave...

Przeglądając R-bloggers trafiłem na ciekawą alternatywę dla Sweave, czyli knitr

Źródło: R-bloggers

admin | niedziela, 18 grudzień 2011 - 12:49 am | | Blog-R

Bezpieczeństwo wewnętrzne kodu...

Około północy zastanawiałem się w jaki sposób zabezpieczyć obiekty w moim kodzie przed niepowołaną zmianą, a dokładnie przed samym sobą... Tworzę dość skomplikowaną strukturę do analizy danych mikromacierzowych i wykorzystuje pewien mechanizm filtrów, który pozwala mi skierować wybrane dane do analizy. Jednakże, jak to bywa w życiu człowieka, mam kiepską pamięć i pracuję na kilku wersjach tych samych danych... Nie mam możliwości upilnowania w takiej sytuacji pożądku w danych, dlatego żeby uchronić się przed analizą różnych danych zmienionym przez pomyłkę filtrem mam zamiar wykorzystać sumy kontrolne, które pozwolą zapanować przynajmniej częściowo nad chaosem.

Znalazłem na szybko dwa pakiety do tworzenia sum kontrolnych, ale tylko jeden z nich działa sensownie: digest.

P.S. Jeśli coś wyżej zostało napisane nieskładnie i nielogicznie, to bardzo przepraszam, ale jest już późno. Dobranoc.

P.S.2. Dla zainteresowanych kod R'a tego drugiego.

P.S.3. Znalazłem też implementacje MD5 w rozmaitych językach.

admin | niedziela, 18 grudzień 2011 - 12:26 am | | Blog-R

Kalendarz na 2012

Jeszcze nie testowałem, ale jest to godne uwagi

    library(ggplot2)
 
    # setting a parameter
    year <- 2012
    d <- seq.Date(as.Date(paste(year, "-01-01", sep = "")), as.Date(paste(year, "-12-31", sep = "")), by="days")
    z <- data.frame(Y = format(d, "%Y"), M = as.numeric(format(d, "%m")), D = as.numeric(format(d, "%d")), W = format(d, "%w"))
 
    # creating a image with ggplot2.
    c <- ggplot(z, aes(D, M))
    c + geom_text(aes(label=z$D, colour=factor(W), size = 20)) +
    scale_colour_manual(values = c("magenta", rep("black", 5),"darkturquoise"))+
    scale_y_continuous(trans = "reverse", breaks = 1:12) +
    labs(x="", y="") +
    opts(
    title = paste("CalendaR", year, "\n", sep = " "),
    plot.title = theme_text(colour = "black"),
    legend.position = "none"
    ) 

Created by Pretty R at inside-R.org

Źródło: R-bloggers / Knowledge Discovery

admin | czwartek, 15 grudzień 2011 - 1:15 pm | | Blog-R

Frustracje czynnikowe...

Zachowywanie się typu czynnikowego w R może zszargać nerwy nie jednego... i to nie tylko początkującego.

Przykład jednej z kilku frustrujących czynności.

admin | czwartek, 15 grudzień 2011 - 1:10 pm | | Blog-R

Znalezione w sieci - przyspieszanie kodu

Jeśli znajdę chwilę streszczę i wyciągnę wnioski, jeśli nie... zapraszam do źródeł:

http://statisfaction.wordpress.com/2011/01/27/speed-up-your-r-code/

http://xianblog.wordpress.com/2010/09/06/insane/

http://statisfaction.wordpress.com/2011/02/04/speed-up-your-r-code-with-c/

admin | poniedziałek, 12 grudzień 2011 - 11:26 pm | | Blog-R

Analiza sieci społecznościowych z zastosowaniem R'a i Gephis

Artykuł z końca kwietnia 2010 z filmami dotyczący R i Gephis.

Źródło: R-bloggers

admin | poniedziałek, 12 grudzień 2011 - 6:53 pm | | Blog-R

LondonR - prezentacje

Warto zapoznać się z prezentacjami z konferencji LondonR, która odbyła się 6 grudnia 2011.

Na stronie LondonR można znaleźć także prezentacje z poprzednich lat.

W wolnej chwili przedstawię mój subiektywny wybór.

admin | poniedziałek, 12 grudzień 2011 - 1:44 pm | | Blog-R

UseR! 2011 prezentacje i filmy

Materiały z konferencji UseR! 2011 dostępne w jednym miejscu, zebrane przez R-bloggers.

Kilka rzeczy, które mnie sczególnie zainteresowało (wybór był bardzo subiektywny):

1. Nomography - prezentacja relacji pomiędzy trzema zmiennymi (ARTYKUŁ).

2. GPU computing and R

3. Medical image processing with TractoR

4. Vector Image Processing

5. Using the Google Visualisation API with R

6. Web 2.0 for R scripts & workflows: Tiki & PluginR

7. Your R application on a Cloud Computing Cluster

8. Rc2: R Collaboration in the Cloud

9. Easy interactive ggplots (oparte na programowaniu GUI)

10. animatoR dynamic graphics in R

11. Graphical User Interface for Modifying Structables and their Mosaic Plots

12. Power and Sample Size Estimation for Microarray Studies

13. Automatic Generation of Exams in R

admin | poniedziałek, 12 grudzień 2011 - 12:22 am | | Blog-R

Skoro były karty kredytowe to czas na IBAN

Sprawdzanie poprawności numerów kont bankowych:

function(iban){
wynik <- logical(length(iban))
 for (p in 1:length(iban)){
  IBAN <- iban[p]
  IBAN <- gsub(" ","", IBAN)
  IBAN <- gsub("-","",IBAN)
  literki <- LETTERS
  cyferki <- 10:35
  IBAN2 <- paste(substr(IBAN, 5, nchar(IBAN)), substr(IBAN,1,4),sep="")
  for(n in 1:length(literki)){
   gsub(literki[n], cyferki[n], IBAN2) -> IBAN2
  }
  while(nchar(IBAN2)>0){
   if(nchar(IBAN2)>6){
    checktest <- as.numeric(substr(IBAN2,1,6))
    checkrest <- checktest %% 97
    IBAN2 <- paste(checkrest,substr(IBAN2,7,nchar(IBAN2)),sep="")
   }else{
    checktest <- as.numeric(substr(IBAN2,1,nchar(IBAN2)))
    checkrest <- checktest %% 97
    IBAN2 <- ""
   }
  }
  if(checkrest == 1){
   wynik[p] <- TRUE
  }else{wynik[p] <- FALSE}
 }
 return(wynik)
}

Created by Pretty R at inside-R.org

admin | niedziela, 11 grudzień 2011 - 12:51 am | | Blog-R

Szuflada - Karta kredytowa

Czy numer karty się zgadza?

function(cardno){
 wynik <- logical(length(cardno))
  for(p in 1:length(cardno)){
   CARDNO <- cardno[p]
   CARDNO <- gsub(" ","",CARDNO)
   CARDNO <- gsub("-","",CARDNO)
   wagi <- rep(c(2,1), length.out=16)
   if(nchar(CARDNO) > 16){
    wynik[p] <- FALSE
   }else{
    roznica = 16 - nchar(CARDNO)
    suma = ""
    for (i in nchar(CARDNO):1){
     suma <- paste(as.numeric(substr(CARDNO,i,i))*wagi[i+roznica],suma, sep="")
    }
    sk = 0
    for(i in 1:nchar(suma)){
     sk <- sk + as.numeric(substr(suma,i,i))
    }
    sk <- sk %% 10
    if (sk == 0){
     wynik[p] <- TRUE
    }else{wynik[p] <- FALSE}
   }
  }
 return(wynik)
}

Created by Pretty R at inside-R.org

admin | niedziela, 11 grudzień 2011 - 12:50 am | | Blog-R

Kolejne pokłady szuflady - REGON

Był PESEL był NIP, teraz czas na REGON:

function(regon){
 wagi7 <- 234567
 wagi9 <- 89234567
 wagi14 <- 2485097361248
 wynik <- logical(length(regon))
 for(p in 1:length(regon)){
  REGON <- regon[p]
  REGON <- gsub(" ","",REGON)
  REGON <- gsub("-","",REGON)
  suma <- 0
  if(nchar(REGON) == 7){
    for(i in 1:6){
     suma <- suma + as.numeric(substr(REGON,i,i))*as.numeric(substr(wagi7,i,i))
    }
    sk <- suma %% 11
    if(sk == as.numeric(substr(REGON,7,7)) | sk == ((as.numeric(substr(REGON,7,7))+10))){
     wynik[p] <- TRUE
    }else{wynik[p] <- FALSE}
  }else{
  if(nchar(REGON) == 9 | nchar(REGON) == 14){
    test9 <- function(regon9){
     sumas <- 0
      for(i in 1:8){
       sumas <- sumas + as.numeric(substr(regon9,i,i))*as.numeric(substr(wagi9,i,i))
      }
      sk <- sumas %% 11
      if(sk == as.numeric(substr(regon9,9,9)) | sk == ((as.numeric(substr(regon9,9,9))+10))){
       return(TRUE)
      }else{return(FALSE)}
    }
   if(nchar(REGON)==9){
    wynik[p]<-test9(REGON)
   }else{
     sk1<-test9(substr(REGON,1,9))
     for (i in 1:13){
      suma <- suma +as.numeric(substr(REGON,i,i))*as.numeric(substr(wagi14,i,i))
     }
     sk <- suma %% 11
     if(sk == as.numeric(substr(REGON,14,14)) | sk == ((as.numeric(substr(REGON,14,14))+10))){
      sk2 <- TRUE
     }else{sk2 <- FALSE}
     if(sk1 & sk2){wynik[p]<-TRUE
     }else{wynik[p]<-FALSE}
     }
  }else{wynik[p]<-FALSE}
 }
}
return(wynik)
}

Created by Pretty R at inside-R.org

admin | niedziela, 11 grudzień 2011 - 12:47 am | | Blog-R

Grzebania w szufladzie ciąg dalszy - NIP

Funkcja sprawdza poprawność numeru NIP - operuje na wektrorach:

function(nip){
 wynik <- logical(length(nip))
 for (p in 1:length(nip)){
  NIP <- nip[p]
  wagi <- "657234567"
  suma =0
  if (nchar(NIP) == 10){
   for (i in 1:9){
    suma + as.numeric(substr(NIP,i,i))*as.numeric(substr(wagi,i,i)) -> suma
   }
  sk <- (suma %% 11)
  if(sk == as.numeric(substr(NIP,10,10))){
    wynik[p] <- TRUE
  }else{wynik[p]<-FALSE}
 }else{wynik[p]<-FALSE}
 }
 return(wynik)
 }

Created by Pretty R at inside-R.org

admin | niedziela, 11 grudzień 2011 - 12:46 am | | Blog-R

Wektory numeryczne i znakowe, a ramki danych

Umieszczanie zmiennych typu znakowego i numerycznego w pojedynczej ramce danych powoduje, że wszystkie wektory traktowane są jako czynniki. Jest to bardzo irytujące jeśli później z takiej ramki danych chce się uzyskać wartości numeryczne. Można oczywiście za każdym razem korzystać z funkcji:

as.numeric(as.character(ramka$liczbaCzynnik))

Jednak o wiele lepiej uzyskać ramkę danych, która posiada odpowiednio sformatowane kolumny.

all <- data.frame(cbind(site, year, model, x, y, z))
 
all$x <- as.numeric(x)
all$y <- as.numeric(y)
all$z <- as.numeric(z)

Created by Pretty R at inside-R.org

Przykład zaczerpnięty ze strony: http://www.nomad.priv.at/researchblog/?p=911

admin | niedziela, 11 grudzień 2011 - 12:11 am | | Blog-R

Z szuflady - test numeru pesel

Jakiś czas temu, napisałem kilka prostych funkcji sprawdzających poprawność numerów. Jedną z takich funkcji jest funkcja sprawdzająca poprawność numeru PESEL.

function(pesel){
 if(nchar((pesel))==11){
  cat("Poprawna długość numeru Pesel.\nSprawdzam poprawność numeru:\n")
  wagi <- "1379137913"
  suma=0
  for (i in 1:10){
    suma+as.numeric(substr(pesel,i,i))*as.numeric(substr(wagi,i,i)) -> suma
  }
  sumakontrolna <- 10 - (suma %% 10)
  if (sumakontrolna == as.numeric(substr(pesel,11,11))){
    cat ("NUMER PESEL PRAWIDŁOWY\n")
    return(TRUE)
  } else{
    cat ("Błąd sumy kontrolnej\n")
    return(FALSE)
  }
 }else{
   cat("Pesel ma nieodpowiednia ilość znaków.\n")}
   return(FALSE)
}

Created by Pretty R at inside-R.org

Poniższa implementacja przyjmuje jako argument wektor numerów pesel i zwraca wektor wartości logicznych TRUE, gdy prawidłowy i FALSE, gdy błędny.

function(PESEL){
 wynik <- logical(length(PESEL))
 for (p in 1:length(PESEL)){
  pesel <- PESEL[p]
  if(nchar((pesel))==11){
   wagi <- "1379137913"
   suma=0
   for (i in 1:10){
    suma+as.numeric(substr(pesel,i,i))*as.numeric(substr(wagi,i,i)) -> suma
   }
   sumakontrolna <- 10 - (suma %% 10)
    if (sumakontrolna == as.numeric(substr(pesel,11,11))){
     wynik[p] <- TRUE
    }else{wynik[p]<-FALSE}
  }else{wynik[p]<-FALSE}
 }
 return(wynik)
}

Created by Pretty R at inside-R.org

admin | sobota, 10 grudzień 2011 - 11:03 pm | | Blog-R

Sloty klasy S4 jako lista

Przedstawiam bardzo prostą funkcję, która przekształca prosty (bez slotów zagnieżdżonych w slotach) obiekt klasy S4 do listy, przy czym zwraca jednynie nie puste sloty:

slot.as.list<-function(object){
	sn<-slotNames(object)
	tmp<-list()
	for(i in sn)
		if(!is.empty(slot(object,i))) tmp[[i]]<-slot(object,i)
	return(tmp)
}

Created by Pretty R at inside-R.org

*Wymaga funkcji is.empty. Usunięcie warunku spowoduje, że funkcja zwróci także puste sloty i nie będzie wymagała wymienionej funkcji.

admin | środa, 07 grudzień 2011 - 5:48 pm | | Blog-R

Kolejny sposób na rozwijanie interfejsów graficznych w R

Pakiet RInside zapewnia klasy C++, które ułatwiają osadzanie kodu R'a w kodzie C++ --- zarówno w systemach Linux, OS X, Windows.

Źródło: R-bloggers

admin | sobota, 03 grudzień 2011 - 11:55 pm | | Blog-R | Brak komentarzy

Wysyłanie maili z R'a z wykorzystaniem GUI

Ciekawa propozycja dla chcących całe swoje życie spędzić w eRze;)

A tak na poważnie to wysyłanie maili lub sms'ów (mam gdzieś opracowane takie rozwiązanie, ale jeszcze nie nadszedł odpowiedni czas), przydaje się, kiedy nasze analizy zajmują sporo czasu. W końcu miło jest wyjść na dwór lub pole w zależności od rejonu kraju i otrzymać sms'a lub jak w tym przypadku maila "Wykonało się".

Artykuł znajduje się na R-bloggers.

Tutaj zaś można pobrać kod.

lub wpisać:

source(“http://sendemail-gui-r.googlecode.com/files/GUI_sendEmail.R”) 

Created by Pretty R at inside-R.org

admin | czwartek, 01 grudzień 2011 - 12:25 pm | | Blog-R | Brak komentarzy