OLC731 Hafta 03

Duygu Gençaslan

2024-10-27

VEKTORLER

x <- 1:5
y <- c(1,2)

# vektör eleman sayıları farklı olduğunda
length(x)/length(y)
## [1] 2.5
x + y
## [1] 2 4 4 6 6

Vektördeki verileri toplamak için:

sum(x)

Vektördeki verileri çarpmak için:

prod(x)

Vektördeki verileri sıralamak ve tersine sıralamak için:

sort(x)
rev(x)

Vektördeki verilerin standart sapması için sd()
en büyük veri için max ()
en büyük verinin kaçıncı veri olduğunu görmek için which.max()

İndeksler

ad  <-  c("Ali","Elif","Su","Deniz","Aras",
          "Berk","Can","Ece","Efe","Arda")
ad
##  [1] "Ali"   "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"  
## [10] "Arda"

Vektörden veri seçmek için köşeli parantez [] kullanılmaktadır. Birden fazla eleman seçmek istediğimizde ise c() komutu içerisine yazılmalıdır.

ad[1]
## [1] "Ali"
ad[c(1,4,6)]
## [1] "Ali"   "Deniz" "Berk"
ad[10]
## [1] "Arda"
ad[length(ad)] #sonuncu eleman böyle de bulunabilir.
## [1] "Arda"

Vektöre eleman ekleme

Vektörden nesne çıkarmak ya da eklemek için nesnenin önüne “-” işareti konulmalıdır. Eklemek için ise yeni nesnenin sıra sayısı belirtilir ve eklenmek istenen nesne yazılır ve o sıraya atanır. Not: Tüm bu ekleme ya da çıkarma işlemlerini kaydetmeyi unutmamalıyız.

ad[-1]
## [1] "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"   "Arda"
ad[-c(1,4,6)]
## [1] "Elif" "Su"   "Aras" "Can"  "Ece"  "Efe"  "Arda"
ad
##  [1] "Ali"   "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"  
## [10] "Arda"
ad[11] <- "Esma"
ad
##  [1] "Ali"   "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"  
## [10] "Arda"  "Esma"
ad[c(12,13)] <- c("Demet", "Samet")
ad
##  [1] "Ali"   "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"  
## [10] "Arda"  "Esma"  "Demet" "Samet"
ad <- append(ad, "asli", 4) #dördüncü kişiden önce araya nesne eklemek için.
ad
##  [1] "Ali"   "Elif"  "Su"    "Deniz" "asli"  "Aras"  "Berk"  "Can"   "Ece"  
## [10] "Efe"   "Arda"  "Esma"  "Demet" "Samet"

İki farklı kodu tek satırda yazmak için “;” kullanılır.

ad  <-  c("Ali","Elif","Su","Deniz","Aras",
          "Berk","Can","Ece","Efe","Arda")
boy <- c(160,165,170,155,167,162,169,158,160,164)
kilo <- c(55,55,57,50,48,65,58,62,45,47)

Vektörleri isimlendirme

Az önceki vektörleri adlandırmak için öncelikle adlar boylar ile eşleştirilir. Buradan şu anlaşılabilir: <- atama operatörü ile nesnelere isim vermiş olmuyoruz. Bu vektörü yalnızca kaydediyoruz. İsim atamak için names() kullanılmalıdır.

names(boy) <- ad 
names(boy)
boy

boy [1] #ya da
boy ["Ali"]

İsimlendirmekten vazgeçtiğimizde ise unname () kullanılır.

boy <- unname (boy)
boy

Örüntülerle vektörler oluşturma

Örüntülerle de vektör oluşturulabilir.

rakamlar <- 1:9
rakamlar
## [1] 1 2 3 4 5 6 7 8 9

Belirli kurallara göre de vektörler oluşturulabilir. Bunun için seq() komutu kullanılabilir.

seq(from=1, to=10, by=1)  #1den 10a kadar birer birer artarak
##  [1]  1  2  3  4  5  6  7  8  9 10
seq(from=1, to=3, by=0.4) #birden üçe kadar 0.4 artarak
## [1] 1.0 1.4 1.8 2.2 2.6 3.0
#aynısı seq(from=1, to=3, length=6)

seq(from=1, to=3, length.out=6) #bu komut ile dizide kaç eleman olacağını belirtiriz.
## [1] 1.0 1.4 1.8 2.2 2.6 3.0

Vektörü tekrar ettirme

Vektörleri tekrar ettirmek için rep() komutu kullanılabilir.
Aşağıda da görüldüğü üzere bu komutun içerisinde yer alan each= ile times= birbirinden farklı anlamlara gelir.
each= ile her bir nesne belirtildiği kadar tekrar ettirilir.
times= ile vektör dizisi belirtildiği kez tekrar ettirilir.

rep(0:9, times=3)
##  [1] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
a <- c(3,5,7)
rep(a, each=3)
## [1] 3 3 3 5 5 5 7 7 7
rep(a, each=3, times=3)
##  [1] 3 3 3 5 5 5 7 7 7 3 3 3 5 5 5 7 7 7 3 3 3 5 5 5 7 7 7
rep(a, each=2, times=3)
##  [1] 3 3 5 5 7 7 3 3 5 5 7 7 3 3 5 5 7 7
rep(a, each=3, times=2)
##  [1] 3 3 3 5 5 5 7 7 7 3 3 3 5 5 5 7 7 7
b <- c(1,2,3)
rep(1:3, 1:3)
## [1] 1 2 2 3 3 3

paste() komutu

Bu komut çıktıları her zaman karakterdir ve çeşitli birleştirmeler için kullanılır (id tanımlama gibi)

paste(1,2,3,4)
## [1] "1 2 3 4"
paste("test", 1:10)
##  [1] "test 1"  "test 2"  "test 3"  "test 4"  "test 5"  "test 6"  "test 7" 
##  [8] "test 8"  "test 9"  "test 10"
paste("test", 1:10, sep=".")
##  [1] "test.1"  "test.2"  "test.3"  "test.4"  "test.5"  "test.6"  "test.7" 
##  [8] "test.8"  "test.9"  "test.10"
paste("test", 1:10, "puan", sep="_")
##  [1] "test_1_puan"  "test_2_puan"  "test_3_puan"  "test_4_puan"  "test_5_puan" 
##  [6] "test_6_puan"  "test_7_puan"  "test_8_puan"  "test_9_puan"  "test_10_puan"
paste("test", 1:10, round(rnorm(10),2), sep="_")
##  [1] "test_1_-0.05"  "test_2_-0.63"  "test_3_-0.8"   "test_4_-0.82" 
##  [5] "test_5_-0.24"  "test_6_0"      "test_7_0.85"   "test_8_0.62"  
##  [9] "test_9_-1.2"   "test_10_-1.17"
paste("test", c("A","B", "C", "D", 1:4))
## [1] "test A" "test B" "test C" "test D" "test 1" "test 2" "test 3" "test 4"

Rastgele veri oluşturma

sample (0:100,5)
## [1] 93 20 56 35 91
hist(runif(100,0,5)) #tek biçimli veriler üretiyor (r uni form) ve hist ile histogram çizilir

hist(rnorm(100,0,1))

Alıştırma

ad  <-  c("Ali","Elif","Su","Deniz","Aras",
          "Berk","Can","Ece","Efe","Arda")
boy <- c(160,165,170,155,167,162,169,158,160,164)
kilo <- c(55,55,57,50,48,65,58,62,45,47)

boy <- boy/100
boy <- boy*boy
BKI <- round(kilo/boy, digits=1)
mean(BKI) 
## [1] 20.44

ya da dersteki gibi yapılabilir:

# BKI  hesaplanması
boy_m  <- boy/100
BKI <- kilo/( boy_m * boy_m)
round(mean(BKI),2)

table(boy) #frekans tablosu oluşturma

Paste argümanında ayrıca sep= ve collapse= argümanları var

Günün sorusu

bunun alternatif yolları var.

Yol 1.

set.seed(10)
guc <-round(runif(10, 0, 1),2)
paste(1:10, ".maddenin gucluğu: ", guc, sep="")
##  [1] "1.maddenin gucluğu: 0.51"  "2.maddenin gucluğu: 0.31" 
##  [3] "3.maddenin gucluğu: 0.43"  "4.maddenin gucluğu: 0.69" 
##  [5] "5.maddenin gucluğu: 0.09"  "6.maddenin gucluğu: 0.23" 
##  [7] "7.maddenin gucluğu: 0.27"  "8.maddenin gucluğu: 0.27" 
##  [9] "9.maddenin gucluğu: 0.62"  "10.maddenin gucluğu: 0.43"

Yol 2.

paste1 <- paste(1:10, "maddenin gucluğu", sep=".")
paste2 <- paste(guc) 
paste(paste1, paste2, sep=": ")
##  [1] "1.maddenin gucluğu: 0.51"  "2.maddenin gucluğu: 0.31" 
##  [3] "3.maddenin gucluğu: 0.43"  "4.maddenin gucluğu: 0.69" 
##  [5] "5.maddenin gucluğu: 0.09"  "6.maddenin gucluğu: 0.23" 
##  [7] "7.maddenin gucluğu: 0.27"  "8.maddenin gucluğu: 0.27" 
##  [9] "9.maddenin gucluğu: 0.62"  "10.maddenin gucluğu: 0.43"

Karakter ve Mantıksal Nesneler

substr("YILMAZ", 1,3) #yılmazın ilk üç harfi
## [1] "YIL"
T==TRUE
## [1] TRUE
4<5
## [1] TRUE

Nesneleri değiştirme

as. ile başlayan fonksiyonlarla nesne türleri arasında değişilklik yaparız.

x <- as.numeric("3.14")
as.numeric("olcme")
as.character(TRUE)
as.numeric(TRUE)
class (x)

is. ile başlayan fonksiyonlarla bir nesnenin belirli bir türde olup olmadığını kontrol ederiz.

is.numeric(x)
is.logical(x)
typeof(x)
y <- 2L 
is.integer(y)

Günün Sorusu

ad_soyad<- c("Ayse-Sel","Can-Yucel","Cem-Togay","Banu-Cift")
strsplit(ad_soyad, split = "-")
## [[1]]
## [1] "Ayse" "Sel" 
## 
## [[2]]
## [1] "Can"   "Yucel"
## 
## [[3]]
## [1] "Cem"   "Togay"
## 
## [[4]]
## [1] "Banu" "Cift"
unlist(strsplit(ad_soyad, split = "-")) [c(1,3,5,7)]
## [1] "Ayse" "Can"  "Cem"  "Banu"
unlist(strsplit(ad_soyad, split = "-")) [c(2,4,6,8)]
## [1] "Sel"   "Yucel" "Togay" "Cift"

ya da

ad_soyad<- c("Ayse-Sel","Can-Yucel","Cem-Togay","Banu-Cift")
ad_soyad_acik <- strsplit(ad_soyad, split = "-")

function(x) {x[1]}
## function (x) 
## {
##     x[1]
## }
unlist(lapply(ad_soyad_acik, function (x) {x[1]}))
## [1] "Ayse" "Can"  "Cem"  "Banu"
unlist(lapply(ad_soyad_acik, function (x) {x[2]}))
## [1] "Sel"   "Yucel" "Togay" "Cift"

lapply l apply yani listenin tümü üzerinde uygula.

KENDINIZI TEST EDIN

SORU 1

Ogrenci <- "Ogrenci"
Ogrenci <- paste(Ogrenci, 1:5, sep="")

Vize <- c(50,55,60,70,80)
Final <- c(45,65,85,90,85)

Gecme_notu <- (Vize+Final)/2

Medyan <- median(Gecme_notu)
Std_Sapma <- round(sd(Gecme_notu), digits=2)
Varyans <- round(var(Gecme_notu), digits= 2)

minimum <- min(Gecme_notu)
Ortalama <- mean(Gecme_notu)
maksimum <- max(Gecme_notu)

SORU 2

Sayi_toplam <- function(n){n*(n+1)/2}
Sayi_toplam(5)
## [1] 15

SORU 3

Bu sorunun cevabı ChatGPT ile elde edilmiştir.

#toplam <- function() {
  # Kullanıcıdan sayı al
  n <- as.integer(readline(prompt="Kaça kadar olan sayıların toplamı hesaplansın: "))
  
  # Toplamı hesapla
  sonuc <- sum(1:n)
  
  # Sonucu yazdır
  cat(1, "den", n, "'e kadar olan sayıların toplamı:", sonuc, "\n")}

# Fonksiyonu çalıştır
toplam()

readline() komutu, ekrana bir komut yazdırmak için kullanılır.

cat() fonksiyonu, print() fonksiyonundan farklı olarak, çıktıda girdiğimiz verileri nesne olarak alır.

Örneğin, n argümanına n=5 değeri verildiğinde, bu değer doğrudan kullanılır.
Ayrıca cat(), yukarıdaki gibi bir görünüm sağlar ve tırnak içinde yazdığımız metin, direkt olarak çıktıya yansır.

TURCADEMY BÖLÜM 2 SORU 1

isim <- c("Ali", "Defne", "Meltem", "Semih", "Sevda", 
                "Gizem", "Emre", "Zeynep", "Utku", "Beril")
vize <- c(60,70,50,80,65,70,85,70,92,80)
final <- c(70,65,50,45,67,75,80,85,95,85)

names(vize) <- isim
names(final) <- isim

vize[c("Ali", "Beril")]
##   Ali Beril 
##    60    80
final[c("Ali", "Beril")]
##   Ali Beril 
##    70    85
vize_ort <- mean(vize)
final_ort <- mean(final)
vize_sd <- sd(vize)
final_sd <- sd(final)

summary(vize)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.00   66.25   70.00   72.20   80.00   92.00
summary(final)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   45.00   65.50   72.50   71.70   83.75   95.00
vize > 90 
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE
final > 90
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE
vize < 50
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
final < 50
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
(final_daha_yuksek <- final > vize)
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##   TRUE  FALSE  FALSE  FALSE   TRUE   TRUE  FALSE   TRUE   TRUE   TRUE
final_y <- final[final >= 50]

vize_y <- vize[vize >= 50]


length(final_y)
## [1] 9
length(vize_y)
## [1] 10
isim[which.max(final)]
## [1] "Utku"
isim[which.min(final)]
## [1] "Semih"
vize_toplam <- sum(vize)
final_toplam <- sum(final)

not <- ((vize*40)/100) + ((final*60)/100)
not
##    Ali  Defne Meltem  Semih  Sevda  Gizem   Emre Zeynep   Utku  Beril 
##   66.0   67.0   50.0   59.0   66.2   73.0   82.0   79.0   93.8   83.0
mean(not); median(not); sd(not); var(not); min(not); max(not)
## [1] 71.9
## [1] 70
## [1] 12.88315
## [1] 165.9756
## [1] 50
## [1] 93.8
not_s <- sort(not)

str(not)
##  Named num [1:10] 66 67 50 59 66.2 73 82 79 93.8 83
##  - attr(*, "names")= chr [1:10] "Ali" "Defne" "Meltem" "Semih" ...
attributes(not)
## $names
##  [1] "Ali"    "Defne"  "Meltem" "Semih"  "Sevda"  "Gizem"  "Emre"   "Zeynep"
##  [9] "Utku"   "Beril"
not[mean(not) > not]
##    Ali  Defne Meltem  Semih  Sevda 
##   66.0   67.0   50.0   59.0   66.2
not[66 == not]
## Ali 
##  66
not[72 == not]
## named numeric(0)
not[88 == not]
## named numeric(0)