Życzenia Noworoczne
Życzę Wszystkim w Nowym Roku 2012 samych rozwiązywalnych problemów i radości z życia, oraz R'a ;)
Życzę Wszystkim w Nowym Roku 2012 samych rozwiązywalnych problemów i radości z życia, oraz R'a ;)
Znalazłem w sieci kilka uwag na temat dobrych zasad pisania kodu w R, warto ZOBACZYĆ.
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
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().
Przedstawiam prostą funkcję, która zaokrągla liczbę do wartości najbliższego kroku:
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ę:
Created by Pretty R at inside-R.org
Created by Pretty R at inside-R.org
Źródło: R-bloggers
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")
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ć.
Przeglądając R-bloggers trafiłem na ciekawą alternatywę dla Sweave, czyli knitr.
Źródło: R-bloggers
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.
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
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.
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/
Artykuł z końca kwietnia 2010 z filmami dotyczący R i Gephis.
Źródło: R-bloggers
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.
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Ł).
3. Medical image processing with TractoR
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
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) }
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) }
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) }
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) }
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
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) }
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:
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.
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
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.
lub wpisać:
source(“http://sendemail-gui-r.googlecode.com/files/GUI_sendEmail.R”)