1 Ogrenme Gunlugum

Bu hafta R programlama dersimde özellikle çoklu dosya üretme ve bir klasördeki birçok dosyayı otomatik olarak okuma üzerine çalıştık. Kodları uyguladıkça hem for() döngüsünün mantığını hem de fonksiyon yazarak işlemleri otomatikleştirmenin ne kadar önemli olduğunu daha iyi kavradım.

İlk olarak, kendi fonksiyonumu oluşturarak (veri_sim()) belirli sayıda veri seti üretmeyi öğrendim. Bu fonksiyonun içinde for(i in 1:tekrar){…} yapısını kullanarak her bir döngü adımında rastgele sayılardan oluşan bir matris oluşturdum. Burada matrix() fonksiyonu ile veriyi ürettim ve daha sonra bunu data.frame() ile veri çerçevesine dönüştürdüm.

Aynı zamanda her oluşturduğum veri setini writexl::write_xlsx() fonksiyonuyla otomatik olarak “sim” adlı klasöre kaydettim. Bu süreç sayesinde döngülerin yalnızca işlem tekrarlamakla kalmayıp aynı zamanda dışa veri yazmayı da otomatik hale getirebildiğini fark ettim.

Daha sonra, oluşturduğum bu Excel dosyalarını tekrar R ortamına okuma kısmına geçtim.

Burada iki farklı yöntem öğrendim ve denedim:

1.1 Otomatik dosya bulma yontemi

list.files() fonksiyonunu kullanarak klasördeki tüm .xlsx uzantılı dosyaları tek seferde listeledim. Ardından lapply() ile bu dosyaları readxl::read_excel() fonksiyonuna gönderdim ve hepsini bir kerede okuyabildim. Bu yöntem, dosya sayısı fazla olduğunda çok pratik bir çözüm sunuyor.

1.2 Dongu ile sirayla dosya okuma:

İkinci yöntemde ise yine bir for döngüsü kurarak dosya adlarını paste() fonksiyonu ile tek tek oluşturdum ve her birini read_excel() ile okudum.Paste() kullanarak dosya ismi üretmeyi ve döngü içinde liste doldurmayı (örneğin veriler[[i]] <- …) pekiştirmemi sağladı.

Bu iki yöntemi karşılaştırdığımda, list.files() ve lapply() kombinasyonunun büyük veri operasyonlarında çok daha hızlı ve esnek olduğunu, ancak klasik for döngüsünün de mantığı anlamak açısından önemli olduğunu gördüm.

1.3 Fonksiyon yazımı

Bu hafta üzerinde çalıştığım bir diğer önemli konu ise hem kendi fonksiyonumu yazarak veri üretmek, hem de döngülerle matematiksel işlemler yapmak oldu. Fonksiyon oluştururken farklı argümanlar tanımlayarak R’da bir işlemi nasıl daha esnek ve tekrar kullanılabilir hale getirebileceğimi gördüm.

Fonksiyon içinde önce boş veri setleri oluşturup ardından bu veri setlerinin her sütununu standart normal dağılımdan çekilen değerlerle doldurdum. Bu süreçte özellikle rnorm() fonksiyonunun pratikliğini ve rastgele veri üretmede ne kadar çok kullanıldığını fark ettim. Ürettiğim veri setlerini daha sonra Excel dosyası olarak dışarıya kaydedebildim, böylece fonksiyon sadece veri üretmekle kalmadı, aynı zamanda dosya işlemlerini de otomatik olarak yönetti.

1.4 Döngüler

Döngü mantığını pekiştirmek için basit matematiksel işlemler de yaptım. Örneğin iki sütundan oluşan bir yapıda her satırdaki değerlerin çarpımını hesaplayarak satır satır işlem yapmayı denedim. Bu çalışma, döngülerin veri yapıları üzerinde nasıl ilerlediğini daha somut bir şekilde anlamamı sağladı. Ayrıca iç içe döngü kurmayı da öğrendim. Satır ve sütun indekslerini kullanarak bir çarpım tablosu oluşturdum ve bu sayede çift döngülerin matris yapıları üzerinde nasıl çalıştığını daha iyi kavradım. Her bir döngünün hem satırları hem de sütunları sistematik bir şekilde dolaşması sayesinde matris işlemlerinin mantığı çok daha net hale geldi.

Bu çalışmaların sonucunda R’da hem kendi fonksiyonlarımı yazma hem de döngüleri gerçek veriler ve matematiksel işlemler üzerinde kullanma konusunda önemli bir ilerleme kaydettiğimi düşünüyorum.

1.5 While

While döngülerinin mantığını ve bu döngülerin koşullu durumlarda nasıl çalıştığını daha iyi anlamaya yönelik çalışmalar yaptım. For döngülerine göre daha dinamik olan while döngülerinde, işlemin ne zaman biteceğine döngü yapısının değil, tamamen belirlenen koşulların karar verdiğini gördüm. Örneğin bir sayaç oluşturup belirli bir koşul sağlanana kadar bu sayacın artmasını sağlayarak while döngüsünün sürekli olarak koşulu kontrol ederek ilerlediğini fark ettim. Bu çalışma döngülerin akış kontrolünde ne kadar önemli olduğunu anlamamı sağladı.

Bunlara ek olarak, kullanıcıdan veri almayı ve bu veriyi bir döngü içinde kullanmayı da öğrendim. Kare bir matrisin boyutunu kullanıcıya sorduktan sonra, iç içe döngü kurarak satır ve sütun indekslerinin çarpımından oluşan bir matris ürettim. Böylece hem kullanıcı etkileşiminin hem de matris işlemlerinin döngülerle nasıl birleştirilebileceğini deneyimledim. Matris boyutu büyük olduğunda yalnızca ilk 10x10’luk kısmı görüntüleyerek ölçeklenebilirlik ve çıktı kontrolü üzerine de pratik yaptım.

Bu dersin sonunda artık farklı koşullarda çalışan döngüleri daha rahat anlayabiliyor ve gerektiğinde veri üreten ya da kullanıcı ile etkileşen yapılar kurabiliyorum.

2 Sıra Sizde Cozumleri

2.1 Soru 3

Örnek veri seti kodu aşağıdaki gibidir. Örnek veri setinde i. satırda negatif sayı yok ise çıktıda i. satırın ortalaması….dir yazsin.Eğer veri setinde her hangi bir satırda negatif sayı var ise satır i negatif sayı bulunmaktadır.

Veri setindeki satırlardaki toplam negatif sayı toplamı üçü geçerse çktıda cok sayıda negatif sayı yazsın ve döngü çalışmayı durdursun.

set.seed(1786)
ornek <- exp(matrix(rnorm(2000), nrow = 100))
index1.temp <- sample(1:100, 10)
index2.temp <- sample(1:20, 10)
for(i in 1:10){
  ornek[index1.temp[i], index2.temp[i]] <- -1
}

2.2 Cozum

neg_toplam <- 0   

for (i in 1:nrow(ornek)) {
  
  # i. satir al
  satir_i <- ornek[i, ]
  
  # o satırdaki negatif sayı adedi
  neg_sayisi <- sum(satir_i < 0)
  
  if (neg_sayisi == 0) {
    # negatif yoksa ortalamayı yazdır
    satir_ort <- mean(satir_i)
    print(paste("Satir", i, "ortalaması", satir_ort))
  } else {
    # negatif varsa uyarı yaz
    print(paste("Satir", i, "negatif sayi icermektedir."))
    # toplama ekle
    neg_toplam <- neg_toplam + neg_sayisi
  }
  
  # Toplam negatif sayısı 3'ü geçtiyse:
  if (neg_toplam > 3) {
    print("Cok sayida negatif sayi var, dongu durduruluyor.")
    break
  }
}
## [1] "Satir 1 ortalaması 1.81024640410365"
## [1] "Satir 2 ortalaması 1.38518610357355"
## [1] "Satir 3 ortalaması 1.91306477718819"
## [1] "Satir 4 ortalaması 1.4112379414075"
## [1] "Satir 5 ortalaması 1.4449874985066"
## [1] "Satir 6 ortalaması 1.45095623366252"
## [1] "Satir 7 ortalaması 1.28395242730511"
## [1] "Satir 8 ortalaması 1.09256285552594"
## [1] "Satir 9 ortalaması 1.42368154628106"
## [1] "Satir 10 negatif sayi icermektedir."
## [1] "Satir 11 ortalaması 1.63867357063309"
## [1] "Satir 12 negatif sayi icermektedir."
## [1] "Satir 13 ortalaması 1.47012239341985"
## [1] "Satir 14 ortalaması 1.68760963291761"
## [1] "Satir 15 ortalaması 1.51554665095691"
## [1] "Satir 16 ortalaması 1.99518274468864"
## [1] "Satir 17 ortalaması 1.47942292790106"
## [1] "Satir 18 ortalaması 1.4444947260594"
## [1] "Satir 19 ortalaması 1.54378752827146"
## [1] "Satir 20 ortalaması 2.17983862702061"
## [1] "Satir 21 ortalaması 1.48707990280766"
## [1] "Satir 22 ortalaması 2.10918427665028"
## [1] "Satir 23 ortalaması 2.53701879215026"
## [1] "Satir 24 negatif sayi icermektedir."
## [1] "Satir 25 negatif sayi icermektedir."
## [1] "Cok sayida negatif sayi var, dongu durduruluyor."

2.3 SORU 4

Asagıdaki geometrik şekilleri farklı kodlamalar ile oluşturunuz

2.3.1 ici dolu kare gosterimi

n <- 5   # kare boyutu

for (i in 1:n) {
  for (j in 1:n) {
    cat("* ")
  }
  cat("\n")
}
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * *

2.3.2 ici bos kare gosterimi

n <- 5

for (i in 1:n) {
  for (j in 1:n) {
    if (i == 1 || i == n || j == 1 || j == n) {
      cat("* ")
    } else {
      cat("  ")
    }
  }
  cat("\n")
}
## * * * * * 
## *       * 
## *       * 
## *       * 
## * * * * *

2.3.3 Sola dayalı ucgen cizimi

n <- 5

for (i in 1:n) {
  cat(rep("*", i), "\n")
}
## * 
## * * 
## * * * 
## * * * * 
## * * * * *

2.3.4 ici dolu eskenar ucgen gosterimi

n <- 5

for (i in 1:n) {
  bosluk <- n - i          
  yildiz <- 2 * i - 1      
  
  cat(strrep(" ", bosluk))
  cat(strrep("*", yildiz), "\n", sep = "")
}
##     *
##    ***
##   *****
##  *******
## *********

2.3.5 ici bos eskenar ucgen cizimi

n <- 5

for (i in 1:n) {
  bosluk <- n - i
  
  if (i == 1) {
    # sadece tepedeki yıldız
    satir <- "*"
  } else if (i == n) {
    # en alttaki tamamen dolu satır
    satir <- strrep("*", 2 * i - 1)
  } else {
    # aradaki içi boş satırlar: *   *
    ic_bosluk <- 2 * i - 3
    satir <- paste0("*", strrep(" ", ic_bosluk), "*")
  }
  
  cat(strrep(" ", bosluk), satir, "\n", sep = "")
}
##     *
##    * *
##   *   *
##  *     *
## *********

2.3.6 Dik ucgen saga dayalı gosterimi

n <- 5

for (i in 1:n) {
  bosluk <- n - i
  yildiz <- i
  cat(strrep(" ", bosluk), strrep("*", yildiz), "\n", sep = "")
}
##     *
##    **
##   ***
##  ****
## *****

##Diyagonal iki cizgi gosterimi

n <- 5

# 1. diyagonal
for (i in 1:n) {
  cat(strrep(" ", i - 1), "*\n", sep = "")
}
## *
##  *
##   *
##    *
##     *
cat("\n")  # araya boş satır da koyabilirsin
# 2. diyagonal
for (i in 1:n) {
  cat(strrep(" ", i - 1), "*\n", sep = "")
}
## *
##  *
##   *
##    *
##     *

2.4 Datacamp

Datacampta da ödev olarak verilen tüm dosyaları bitirdim..Kodların çoğunu kendim yardım almadan yazmaya çalıştım..Datacampta düzenli olarak iki günde bir yaptığım tekrarların çok faydalı olduğunu düşünüyorum.