Admin
Administrator
Joined: 22 Jun 2009
Posts: 27
Read: 0 topics
Warns: 0/5
|
Posted: Sun 16:33, 03 Dec 2017 Post subject: R |
|
|
[link widoczny dla zalogowanych]
LICZBY PIERWSZE
rm(list=ls()) //usuniecie calej pamieci wszystkich zmiennych itd.
piersi = function(x) {
if (x==2) {return("DAAA")}
else {
if (x%%2==0) {return("NIE XD")}
else {
for (i in 2: (x/2)) {
if (x%%i==0) {return("NIE XP")}
else {i=i+1}
}
}
return("TAK NOO")
}
}
piersi(2)
piersi(3)
piersi(5)
POCHODNA FUNKCJI W PUNKCIE
f1 = function(x){sin(x)*(2.71828^x)}
pochodna = function(f, x, h)
{
wynik = (f(x + h) - f(x - h)) / (2 * h)
return(wynik)
}
pochodna(f1, 2.2, 10^-5)
d2f = function(f, x, h){
result <- (f(x+h)-2*f(x)+f(x-h))/(h^2)
return(result)
}
d2f(f1, 2.2, 10^-5)
ZIARNO LOSOWANIA, GENEROWANIE TABLIC LICZB PSEUDOLOSOWYCH, ŚREDNIA, MINIMUM, ODCHYLENIE, MAKSIMUM
set.seed(68214)
x1<-(rnorm(10^6, mean = 2, sd = 1))
#x1
x2<-(rnorm(10^3, mean = 3, sd = 1))
#x2
y <- x1+x2
y
min(y)
max(y)
mean(y)
sd(y)
HISTOGRAM, RYSOWANIE LINII NA WYKRESIE
hist(y, col="yellow", main="histooo", xlab="a")
abline(h=mean(y, na.rm= TRUE), col="black")
abline(h=min(y, na.rm= TRUE), col="black")
abline(h=max(y, na.rm= TRUE), col="red")
abline(h=sd(y, na.rm= TRUE), col="green")
TABLICE, ZAOKRĄGLANIE, PĘTLA
x <- (rnorm(144, mean = 0, sd = 1))
x
x<- round(x,3)
x
B<-matrix(x, nrow=12, ncol=12, byrow=TRUE)
B
for (i in 1:12) {
for (j in 1:12){
if(i==j){B[i,j] = B[i,j]+10}
if(i==j+3){B[i,j] = 100}
if(i==j-3){B[i,j] = -100}
}
}
B
B <- B*8
B
IMPORTOWANIE DANYCH, WYKRES ROZRZUTU, RYSOWANIE LINII
library(ISLR)
attach(Wage)
head(Wage)
dane <- Wage
dane
head(dane)
summary(dane)
plot(Wage$wage, col="pink", xlab="iksy", ylab="igreki", main = "rozrzut", pch=20, xlim=c(-100, 3100), ylim=c(-10,500))
abline(h=mean(dane$wage), col="purple", lty=3, lwd=3)
abline(h=mean(dane$wage)+3*sd(dane$wage), col="red", lty=1, lwd=3)
abline(h=mean(dane$wage)-3*sd(dane$wage), col="red", lty=1, lwd=3)
KLASA OBIEKTU, ZMIENNE BINARNE, LISTA LICZB
wage
mean(wage)
wage.binarna <- rep(0, 3000)
wage.binarna
for(i in 1:3000)
{
if (wage[i] < 111.7036) {wage.binarna[i] <- 1}
else {wage.binarna[i] <- 0}
}
wage.binarna
wage.binarna <- factor(wage.binarna)
class(wage.binarna)
table(wage.binarna)
head(dane)
dane$wage.binarna <- wage.binarna
head(dane)
USUWANIE KOLUMN Z DANYCH
dane<-dane[-c(11,12)]
ZBIÓR TESTOWY I UCZĄCY SIĘ/ TRENINGOWY
set.seed(68214)
train <- sample(1:nrow(dane), nrow(dane)*0.7)
test <- dane[-train,]
train <- dane[train,]
DRZEWA KLASYFIKACJI, LASY LOSOWE, DUŻE DRZEWA, MACIERZE, TROCHE RZECZY KTORYCH NIE ROZUMIEM, ROCR, PROGNOZY
install.packages("rpart")
library(rpart)
install.packages("rpart.plot")
library(rpart.plot)
set.seed(68214)
drzewo.norm <- rpart(wage.binarna ~ ., data = train, method="class")
plot(drzewo.norm, margin = 0.1)
text(drzewo.norm, pretty = 0)
rpart.plot(drzewo.norm)
#jesli zmienna edukacja ma inne wartosci niz college grad lub advanced grad to zarobki nizsze od sredniej (wage.binarna=1)
#w przeciwnym wypadku i jesli zmienna maritl ma wartosc married lub separated to zarobki wyzsze od sredniej(wage.binarna=0)
#.5.
set.seed(68214)
drzewo.pom <- rpart(wage.binarna ~., data = train, minsplit = 2, cp=0.001)
drzewo.pom
plot(drzewo.pom, margin = 0.1)
printcp(drzewo.pom)
plotcp(drzewo.pom)
min.error <- which.min(drzewo.pom$cptable[, "xerror"])
points(min.error, drzewo.pom$cptable[min.error, "xerror"], col = "green", pch = 20)
optimal.cp <- drzewo.pom$cptable[min.error, "CP"]
optimal.cp
drzewo.opt <- prune(drzewo.pom, cp = optimal.cp)
plot(drzewo.opt, margin = 0.05)
text(drzewo.opt, pretty = 0)
#plot(drzewo.norm, margin = 0.1)
#tak, rozni sie od drzewa.norm
#.6.
set.seed(68214)
install.packages("randomForest")
library(randomForest)
las <- randomForest(wage.binarna ~., data = train, ntree = 150)
las
varImpPlot(las, bg = 2, main = "wzgl. spadek w. Giniego po uwzgl. zmiennej")
#wzgledna waznosc zmiennych pokazuje, ktore zmienne maja duza, a ktore mala moc predykcyjna
#education i age- bardzo duża moc, sex i region- bardzo mała, zerowa
#.7.
wage.binarna.test <- test$wage.binarna # rzeczywiste wart. wage.bin w zbiorze testowym
wage.binarna.test
wage.binarna.prediction <- predict(drzewo.norm, test, type = "class")
wage.binarna.prediction
conf.matrix.drzewo.norm <- table(wage.binarna.test, wage.binarna.prediction)
conf.matrix.drzewo.norm
wage.binarna.prediction2 <- predict(drzewo.opt, test, type = "class")
conf.matrix.drzewo.opt <- table(wage.binarna.test, wage.binarna.prediction2)
conf.matrix.drzewo.opt
wage.binarna.prediction3 <- predict(las, test, type = "class")
conf.matrix.las <- table(wage.binarna.test, wage.binarna.prediction3)
conf.matrix.las
macierz.klasyfikacji <- list(a= conf.matrix.drzewo.norm,b= conf.matrix.drzewo.opt,c= conf.matrix.las)
lapply(macierz.klasyfikacji, function(x) {(x[1,1]+x[2,2])/(x[1,1]+x[2,2]+x[2,1]+x[1,2])})
Accuracy <- lapply(macierz.klasyfikacji, function(x) {(x[1,1]+x[2,2])/(x[1,1]+x[2,2]+x[2,1]+x[1,2])})
Accuracy
class(Accuracy)
names(Accuracy) <- c("lol", "xd", "xp")
#accuracy oznacza odsetek poprawnie zaklasyfikowanych obserwacji (czyli popr. zaklasyf. przez wszystkie)
#w moim przypadku najwyższe accuracy ma drzewo.opt (większe nawet niż las), więc jest modelem najlepszym
#.8.
rrr <- predict(drzewo.opt, newdata=test)
rrr
rrr <- as.vector(rrr[,2])
library(ROCR)
pred1 <- prediction(rrr, test$wage.binarna)
plot(performance(pred1,"tpr", "fpr"), col = "pink", lwd = 3, main = "ROC")
lines(c(0,1), c(0,1), type = "l", lwd = 3, col = "gray", lty = 2)
RYSOWANIE FUNKCJI NA ZADANEJ DZIEDZINIE
rysuj <- function(f, przedz) {
x <- seq(przedz[1], przedz[2], by = 0.1)
plot(x, f(x))
}
rysuj(cos, c(-2*pi, 2*pi))
DRZEWO KLASYFIKACYJNE, DRZEWO REGRESYJNE
# zadanie 3: - DRZEWO KLASYFIKACYJNE - (ZBIOR DANYCH ZA??????CZONY NA MOODLE)
# dane lemon, pochodz??? ze strony [link widoczny dla zalogowanych]
# prognozujemy czy auto zakupione na aukcji b???dzie udanym zakupem
# zmienna obja???niana: IsBadBuy Identifies if the kicked vehicle was an avoidable purchase, 1 - nieudany zakup
# zmienne obja???niaj???ce:
## Auction Auction provider at which the vehicle was purchased
## VehYear The manufacturer's year of the vehicle
## VehicleAge The Years elapsed since the manufacturer's year
## VehBCost Acquisition cost paid for the vehicle at time of purchase
# (1) Wczytaj zbi???r lemon, sprawd??? ile ma obserwacji i wy???wietl tabel??? cz???sto???ci dla zmiennej obja???nianej,
dane <- read.csv("lemon.csv")
nrow(dane)
table(IsBadBuy)
# (2) Wygeneruj 4 wykresy obok siebie w schemacie 2x2 (funkcja par()): 3 histogramy cz???sto???ci dla zmiennych obja???niaj???cych
# i 1 wykres dla zmiennej kategorycznej (wykorzystaj funkcje barplot()). Wyskaluj osie, zmie??? tytu???y wykres???w i ka???dy z nich
# pokoloruj na inny kolor.
par(mfrow = c(2,2))
hist(VehicleAge, freq = TRUE, col = "blue")
hist(VehYear, freq = TRUE, col = "orange")
hist(VehBCost, freq = TRUE, col = "green")
barplot(table(Auction), col = "yellow")
# (3) Podziel zbi???r wej???ciowy na zb treningowy (70%) i testowy (30%)
train <- sample(1:nrow(dane), 0.7*nrow(dane))
test <- dane[-train,]
# (4) Za pomoc??? pakietu rpart wygeneruj du???e drzewo dezycyjne, sprawd??? ile ma li???ci, a nast???pnie znajd??? jego optymaln??? wielko??????
# i zaznacz czerwonym kwadratem na wykresie zale???no???ci wielko???ci drzewa od b??????du kroswalidacyjnego xerror.
library(rpart)
drzewo <- rpart(IsBadBuy ~ VehicleAge+VehYear+VehBCost+Auction, data = dane, subset = train,
cp = 0.0001, method = "class")
plotcp(drzewo)
min.error <- which.min(drzewo$cptable[,"xerror"])
opt.size <- drzewo$cptable[min.error, "CP"]
points(min.error, drzewo$cptable[min.error, "xerror"], pch = 15, col = "red")
# (5) Przytnij skonstruowane drzewo do jego optymalnej wielko???ci, zwizualizuj i zinterpretuj wyniki.
drzewo2 <- prune.rpart(drzewo, cp = opt.size)
plot(drzewo2, margin = 0.1)
text(drzewo2, pretty = 0)
# (6) Oce??? na zbiorze testowym skonstruowany model za pomoc??? macierzy klasyfikacji: (prognozowane warto???ci vs rzeczywiste)
# oraz skonstruowanej krzywej ROC, na kt???rej zaznacz krzyw??? przerywan??? model losowy i czerwon??? kropk??? optimum
# (7) Zapisz krzyw??? ROC do pliku pdf - za pomoc??? funkcji pdf.
table(predict(drzewo2, newdata = test, type = "class"), test$IsBadBuy)
library(ROCR)
p <- predict(drzewo2, test)
p <- as.vector(p[,2])
pdf("krzywa ROC.pdf")
pred <- prediction(p, test$IsBadBuy)
plot(performance(pred, "tpr", "fpr"), colorize = T, lwd = 3)
lines(c(0,1), c(0,1), type = "l", lty = 2)
points(0,1, pch = 19, col = "red")
dev.off()
# zadanie 4: DRZEWO REGRESYJNE
# prognoza rocznych zarobk???w graczy w Baseball
# [link widoczny dla zalogowanych]
# zmienna obja???niana - Salary
# (1) Wczytaj zbi???r Hitters do??????czony do pakietu ISLR, wy???wietl pierwszych kilka wierszy
library(ISLR)
dane <- Hitters
head(dane)
# (2) Sprawd??? rozk???ad zmiennej Salary, narysuj dwa wykresy obok siebie i wyeksportuj je do pliku .jpg:
# pierwszy z nich to histogram cz???sto???ci w kolorze zielonym z odpowiednio wyskalowanyim osiami,
# a drugi to pomara???czowy wykres rozrzutu zmiennej Salary, na kt???rym kolorem niebieskim zaznacz warto?????? ???redni???,
# ???redni??? + 3 odchylenia stand, ???redni??? - 3 odchylenia stand Uwaga: zmienna Salary ma braki danych.
# Zmie??? nazwy osi i odpowiednio wyskaluj je, nadaj tytu???.
summary(Salary)
jpeg("wykresy.jpg")
par(mfrow=c(2,1))
hist(Salary, col = "green")
plot(Salary, col = "orange")
abline(h=c(mean(Salary, na.rm=T), mean(Salary, na.rm=T) + sd(Salary, na.rm = T),
mean(Salary, na.rm=T) - sd(Salary, na.rm = T)), col = "blue", lty = 2)
dev.off()
# (3) Podziel zbi???r na zbi???r treningowy i TESTOWY
set.seed(123)
index <- runif(1:nrow(dane)) < 0.7
train <- dane[index,]
test <- dane[!index,]
# (4) Wykonaj odpowiednie transformacje zmiennej Salary, ???eby skontruuowa??? nast???puj???ce 3 drzewa decyzyjne:
# piewsze z nich jako zmienn??? obja???nian??? ma zmienn??? Salary, drugie zmienn??? "Salary.OK", kt???ra braki danych ma zast???pione
# warto???ci??? ???redni???, a trzecie drzewo jest zbudowane na mniejszym zbiorze danych z usuni???tymi brakami danych zmiennej Salary.
Salary.OK <- Salary
Salary.OK[is.na(Salary.OK)] <- mean(Salary.OK, na.rm = T)
train <- cbind(train, Salary.OK = Salary.OK[index])
test <- cbind(test, Salary.OK = Salary.OK[!index])
str(train)
str(test)
drzewo1 <- rpart(Salary ~. -Salary.OK, data = train)
drzewo2 <- rpart(Salary.OK ~. - Salary, data = train)
drzewo3 <- rpart(Salary ~. - Salary.OK, data = train, na.action = na.omit)
# (5) Por???wnaj wygenerowane drzewa
print(sum(residuals(drzewo1)^2))
print(sum(residuals(drzewo2)^2))
print(sum(residuals(drzewo3)^2))
# (6) Zaprognozuj warto???ci Salary na zbiorze testowym i zapisz wyniki do pliku csv2.
Salary.prognoza <- predict(drzewo1, newdata = test)
write.csv2(Salary.prognoza, file="prognoza.csv")
par(mfrow=c(2,1))
> x <- "line 4322: He is now 25 years old, and weights 130lbs"
> y <- grepl("[[:digit:]]",x)
> y
[1] TRUE
Vector match:
>str <- c("Regular", "expression", "examples of R language")
>x <- grepl("x*ress",str)
>x
[1] FALSE TRUE FALSE
minimum z wielu liczb
min> pmin(5:1, pi) #-> 5 numbers
[1] 3.141593 3.141593 3.000000 2.000000 1.000000
wywoływanie zewnętrznego skryptu funkcji całego kodu sczytywanie
> list.files()
[1] "bottle1.R" "bottle2.R"
> source("bottle1.R")
[1] "This be a message in a bottle1.R!"
w wektorze może być tylko jeden typ zmiennych, automatycznie je zmienia
Vectors cannot hold values with different modes (types). Try mixing modes and see what happens:
sekwencja z określonym interwałem
> seq(5, 9, 0.5)
[1] 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0
kilka elementy wektora
> sentence[c(1, 3)]
tworzenie macierzy
plank <- 1:8
dim(plank) <- c(2, 4) // liczba wierszy liczba kolumn
print(plank)
albo
> matrix(1, 5, 5)
taka mapa sie rysuje (elevation jest macierza)
> contour(elevation)
wykres 3d wartosci macierzy
> persp(elevation)
> persp(elevation, expand=0.2) // zeby nie byly takie wielkie roznice
heatmap macierzy (tutaj volcano jst macierza)
> image(volcano)
wykresy
> weights <- c(300, 200, 100, 250, 150)
> prices <- c(9000, 5000, 12000, 7500, 18000)
> plot(weights, prices, pch=as.integer(types))
> legend("topright", c("gems", "gold", "silver"), pch=1:3)
albo
> legend("topright", levels(types), pch=1:length(levels(types)))
tworzenie ramki danych
> treasure <- data.frame(weights, prices, types)
wywoływanie całej kolumny ramki danych podwójne nawiasy
> treasure[[2]]
albo
> treasure[["weights"]]
albo (tutaj bez ""
> treasure$prices
sczytywanie danych
read.csv("table.csv") jak sa po przecinku
a jak jest txt i pooddzielane tabami i ma naglowki to
> read.table("infantry.txt", sep="\t", header=TRUE)
łączenie tabel w R coś jak inner join w SQL i sam łączy po tych kolumnach które się nazywają tak samo
> targets <- read.csv("targets.csv")
> infantry <- read.table("infantry.txt", sep="\t", header=TRUE)
> merge(x = targets, y = infantry)
sprawdzanie czy jest korelacja między dwiema wartościami:
> cor.test(countries$GDP, countries$Piracy)
wyswietli sie cos tam cos tam p-value < 2.2e-16 no i wiadomo jak p<0.05 to jest korelacja
plotowanie rysowanie wykres zależności liniowej które się przydaje do estymacji
> line <- lm(countries$Piracy ~ countries$GDP)
> abline(line)
dobry pakiet do rysowania i wyświetlanie pomocy o pakiecie:
> install.packages("ggplot2")
> help(package = "ggplot2")
rysowanie z jego pomocą
> library(ggplot2)
> qplot(weights, prices, color = types)
The function ls lists simply the objects in memory (only names) :
> name <- "Carmen"; n1 <- 10; n2 <- 100; m <- 0.5
> ls()
[1] "m" "n1" "n2" "name"
pat jest od pattern i zwraca nam imiona tych rzeczy z pamieci ktore maja w nazwie "m"
> ls(pat= "m")
[1] "m" "name"
zaczynajace sie na m i usuniecie ich z pamieci:
> ls(pat= "^m")
>rm(list=ls(pat="^m"))
funkcja apropos wyswietla liste wszystkich funkcji zawierajacych w nazwie to slowo (z zainstalowanych pakietów)
> apropos(help)
wiecej szczegolow o tym co w pamieci:
> ls.str()
jak chcemy sprawdzić pomoc o wszystkim nie tylko z zainstalowanych pakietów:
> help("bs", try.all.packages = TRUE)
generowanie jakichś ciągów:
> sequence(4:5)
[1] 1 2 3 4 1 2 3 4 5
> gl(3, 5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
> gl(3, 5, length=30)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
> gl(2, 6, label=c("Male", "Female"))
[1] Male Male Male Male Male Male
[7] Female Female Female Female Female Female
wyświetlanie ramki danych ze wszystkimi kombinacjami, czyli tutaj bedzie 8 wierszy bo 2*2*2
> expand.grid(h=c(60,80), w=c(100, 300), sex=c("Male", "Female"))
warunki nadawane na wektor, coś jak where albo having w sql, logical operators
x <- c(1:10)
x[(x> | (x<5)]
# wypisze 1 2 3 4 9 10
nadawanie warunków na macierze (tutaj bierzemy te wiersze w ktorych pierwsza pozycja jest wieksza od 1)
macierz <- matrix(1:9, nrow = 3)
macierz
macierz[macierz[,1]>1]
rysowanie ładnych wykresów punktowych, zamiast mpg podstawiasz jakąś data frame albo tabelę. przydatna biblioteka do wykresów (w niej jest ggplot)
install.packages("tidyverse")
library(tidyverse)
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
albo
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = class))
taki kozak wykres ze zamiast kropek jest ladna krzywa
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
filtrowanie wyników tak jak w where q sql:
filter(flights, month == 1, day == 1)
filter w R działa specyficznie jeśli chcemy stosować go z operatorem OR
filter(flights, month == 11 | month == 12) //tak nie zadziala bo sprawdzi czy 11 lub 12 jest prawda a jest prawda wiec da wartosc 1 i wypisze loty ze stycznia XDDD
A useful short-hand for this problem is x %in% y. This will select every row where x is one of the values in y. We could use it to rewrite the code above:
nov_dec <- filter(flights, month %in% c(11, 12))
porównywanie liczb (ogólnie lepiej unikać dzielenia):
sqrt(2) ^ 2 == 2
#> [1] FALSE
near(sqrt(2) ^ 2, 2)
#> [1] TRUE
sortowanie wyników w tabeli (tak jak order by w sql)
arrange(flights, year, desc(month), day) // (tabela, kolumnyyyy)
wyświetlanie tylko części danych:
select(flights, -(year:day)) //wszystko poza tymi kolumnami
select(flights, year:day)
There are a number of helper functions you can use within select():
starts_with("abc"): matches names that begin with “abc”.
ends_with("xyz"): matches names that end with “xyz”.
contains("ijk"): matches names that contain “ijk”.
matches("(.)\\1"): selects variables that match a regular expression. This one matches any variables that contain repeated characters. You’ll learn more about regular expressions in strings.
num_range("x", 1:3) matches x1, x2 and x3.
przesuwanie jakichś kolumn na początek tabeli (chyba):
select(flights, time_hour, air_time, everything())
definiowanie i dodawanie nowych kolumn (funkcja mutate), mozemy w mutate odwolywac sie do kolumn stworzonych w mutate:
flights_sml <- select(flights,
year:day,
ends_with("delay"),
distance,
air_time
)
mutate(flights_sml,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60,
hours = air_time / 60,
gain_per_hour = gain / hours
)[/b]
albo
table1 %>%
mutate(rate = cases / population * 10000)
jeśli chcemy wywołać tylko nowe kolumny a starych nie (funkcja transmute):
transmute(flights,
gain = arr_delay - dep_delay,
hours = air_time / 60,
gain_per_hour = gain / hours
)
Ranking, numerowanie, częstość
y <- c(1, 2, 2, NA, 3, 4)
row_number(y)
#> [1] 1 2 3 NA 4 5
dense_rank(y)
#> [1] 1 2 2 NA 3 4
percent_rank(y)
#> [1] 0.00 0.25 0.25 NA 0.75 1.00
cume_dist(y)
#> [1] 0.2 0.6 0.6 NA 0.8 1.0
min_rank(y)
#> [1] 1 2 2 NA 4 5
min_rank(desc(y))
#> [1] 5 3 3 NA 2 1
summarizing values jakiejś tabeli sumaryczne średnie sumy minima maksima
summarise(flights, delay = mean(dep_delay, na.rm = TRUE))
najbardziej przydatne jak się zrobi grupowanie ale w sql chyba łatwiej:
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
coś jak grupowanie, liczebność według czegoś, jak count po group by w sql
# Compute cases per year
table1 %>%
count(year, wt = cases)
Złączenia łączenie tabel inner outer left right join
x <- tribble(
~key, ~val_x,
1, "x1",
2, "x2",
3, "x3"
)
y <- tribble(
~key, ~val_y,
1, "y1",
2, "y2",
4, "y3"
)
x %>%
inner_join(y, by = "key")
x %>%
left_join(y, by = "key")
x %>%
full_join(y, by = "key")
jak są różne nazwy kluczy:
by = c("a" = "b")
łączenie "pionowe" jak union w sql:
semi_join(x, y) keeps all observations in x that have a match in y. //nigdy nie duplikuje
anti_join(x, y) drops all observations in x that have a match in y.
są też takie funkcje jak w sql:
df1 <- tribble(
~x, ~y,
1, 1,
2, 1
)
df2 <- tribble(
~x, ~y,
1, 1,
1, 2
)
intersect(df1, df2)
union(df1, df2)
setdiff(df1, df2) // dziala jak except w sql
o co chodzi z factorami faktorami:
x1 <- c("Dec", "Apr", "Jan", "Mar")
sort(x1)
#> [1] "Apr" "Dec" "Jan" "Mar" // posortuje nam po prostu alfabetycznie bo nie ma leveli, a jak zrobimy factor to będą
month_levels <- c(
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
)
y1 <- factor(x1, levels = month_levels) //stworzenie factora
//teraz juz dziala sortowanie i jakby ktos wpisal np. "jam" to pokaże "NA" bo nie jest to żaden level
data godzina czas minuta sekunda datepart datediff day month
library(tidyverse)
library(lubridate)
library(nycflights13)
ymd("2017-01-31")
#> [1] "2017-01-31"
mdy("January 31st, 2017")
#> [1] "2017-01-31"
dmy("31-Jan-2017")
#> [1] "2017-01-31"
ymd(20170131)
#> [1] "2017-01-31"
ymd_hms("2017-01-31 20:11:59")
#> [1] "2017-01-31 20:11:59 UTC"
mdy_hm("01/31/2017 08:01")
#> [1] "2017-01-31 08:01:00 UTC"
today()
#> [1] "2017-05-04"
now()
#> [1] "2017-05-04 12:13:13 UTC"
dzień roku albo dzień tygodnia
yday() (day of the year), wday() (day of the week)
wday(datetime, label = TRUE, abbr = FALSE) //label true zwraca skrot a abbr false zwraca pelna nazwe zamiast 2 masz 'tuesday'
i dużo jest innych funkcji z datą i czasem:
[link widoczny dla zalogowanych]
takie jak w SQL wybranie kolumn pod jakimś warunkiem (może być nałożony na inne kolumny):
newdata <- subset(mydata, age >= 20 | age < 10,
select=c(ID, Weight))
fajne podsumowanie (liczba obserwacji wedlug karatow w przedzialach 0.5)
diamonds %>%
count(cut_width(carat, 0.5))
IMPORT
read_csv() reads comma delimited files, read_csv2() reads semicolon separated files (common in countries where , is used as the decimal place), read_tsv() reads tab delimited files, and read_delim() reads in files with any delimiter.
DZIAŁANIA NA STRINGACH, DWA RÓŻNE SPOSOBY ZAPISU:
no_vowels_1 <- !str_detect(words, "[aeiou]")
no_vowels_2 <- str_detect(words, "^[^aeiou]+$")
DZIAŁANIA NA STRINGACH, HEURYSTYCZNE WYKRYWANIE RZECZOWNIKÓW:
noun <- "(a|the) ([^ ]+)"
przed nim jest the lub a i zawiera co najmniej jeden znak niebedacy spacja
DZIAŁANIA NA STRINGACH, ZAMIANA DRUGIEGO Z TRZECIM SŁOWEM
str_replace("([^ ]+) ([^ ]+) ([^ ]+)", "\\1 \\3 \\2")
różne typy wektorów: 12121212 i 111222
y = rep(1:2, 2)
y = rep(1:2, each = 2)
The post has been approved 0 times
Last edited by Admin on Fri 13:24, 09 Feb 2018; edited 67 times in total
|
|