Liste ve Matris Örnekleriyle R'de Döngü İçin

⚡ Akıllı Özet

R'deki `for` döngüsü, bir dizinin her elemanı için bir kod bloğunu bir kez çalıştırır; bu dizi ister vektör, ister liste, ister matris olsun. Bu kılavuz, bunların her birini ele alarak vektörleştirilmiş kodun ne zaman daha iyi bir seçim olduğunu gösterir.

  • 🔁 Temel Sözdizimi: for (i in vector) { expression } ifadesi, her bir elemanı sırayla i'ye atar ve kodun gövdesini çalıştırır.
  • ???? Herhangi bir nesne: Aynı sözdizimi bir vektörü, bir listeyi, bir veri çerçevesi sütun kümesini veya bir matrisin satırlarını dolaşmak için de kullanılabilir.
  • 🧮 İç içe döngüler: Bir matris için iki döngüye ihtiyaç vardır; dıştaki döngü satırlar için, içteki döngü ise sütunlar için kullanılır.
  • 🛑 Akış kontrolü: `break` döngüyü tamamen sonlandırır ve `next` yalnızca geçerli öğeyi atlar.
  • Önce Vektörleştirme: Dahili vektörleştirilmiş işlemler ve `apply` ailesi, açık bir döngüye göre daha hızlı ve daha kısadır.
  • ⚠️ Güvenli Sıralamalar: Nesne boş olduğunda hatalı çalışan 1:length(x) yerine seq_along(x) kullanın.

R'da For Döngüsü, Liste Matrisi

A döngü için Bir kod bloğunu, bir dizinin her öğesi için bir kez tekrarlar. Bu dizi bir vektör, bir liste, bir veri çerçevesi, bir matris veya R'nin üzerinde yineleme yapabileceği herhangi bir başka nesne olabilir. R büyük/küçük harf duyarlıdır, bu nedenle anahtar kelime her zaman küçük harfle yazılır. içinCümle birden fazla satıra yayıldığında süslü parantezler gereklidir.

R'de For Döngüsü Sözdizimi

for (i in vector) {
    Exp
}

Burada,

R vektördeki tüm değişkenler üzerinde döngü yapacak ve exp'nin içinde yazılan hesaplamayı yapacaktır.

R'deki Döngü İçin
R'deki Döngü İçin

Birkaç örnek görelim.

R Örnek 1'deki Döngü İçin: Bir vektörün tüm elemanlarını yineliyoruz ve mevcut değeri yazdırıyoruz.

# Create fruit vector
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana')
# Create the for statement
for ( i in fruit){ 
 print(i)
}

Çıktı:

## [1] "Apple"
## [1] "Orange"
## [1] "Passion fruit"
## [1] "Banana"

R Örnek 2'deki Döngü İçin1'den 4'e kadar olan her tam sayının karesini alın ve sonuçları bir listeye kaydedin.

# Create an empty list
list <- c()
# Create a for statement to populate the list
for (i in seq(1, 4, by=1)) {
  list[[i]] <- i*i
}
print(list)

Çıktı:

## [1]   1  4 9 16

For döngüleri makine öğrenimi çalışmalarında faydalıdır. Bir düzenleme parametresini ayarlamak, birçok aday değeri test etmek ve sürekli olarak güncel tutmak anlamına gelir.ping Kayıp fonksiyonunu en aza indiren fonksiyonu bulmak için, for döngüsü bu aralığı taramanın en basit yoludur.

For döngüsünde break ve next komutlarını nasıl kullanırsınız?

İki anahtar kelime, for döngüsünün normal işleyiş sırasını kesintiye uğratır.

  • kırılma Döngüden hemen çıkar ve kalan tüm öğeleri atlar.
  • sonraki Yalnızca mevcut öğeyi terk eder ve bir sonrakine geçer.
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana')

# break: stop at the first match
for (i in fruit) {
    if (i == 'Passion fruit') {
        print('Found it, stopping here')
        break
    }
    print(i)
}

# next: skip one element and carry on
for (i in fruit) {
    if (i == 'Orange') next
    print(i)
}

İç içe döngülerde, `break` ve `next` komutları yalnızca onları içeren en içteki döngüde etki eder. Matris örneğinde her iki döngüyü de açık bırakmak için bir bayrak değişkeni belirleyin ve bunu dış döngüde de test edin.

İndeksler için `seq_along()` fonksiyonunu kullanın. `for (i in 1:length(x))` yazmak zararsız görünse de, boş bir nesne üzerinde başarısız olur çünkü 1:0, 1, 0 dizisini üretir ve döngü iki kez çalışır. `seq_along(x)` bunun yerine boş bir dizi döndürür, bu nedenle döngü doğru şekilde atlanır:

for (i in seq_along(fruit)) {
    cat(i, fruit[i], '\n')
}

Liste Üzerinde For Döngüsü

tuvaletping Liste üzerinde çalışmak tıpkı tuvalet gibi çalışır.ping Bir vektöre benzer, ancak her eleman farklı bir tür tutabilir:

# Create a list with three vectors
fruit <- list(Basket = c('Apple', 'Orange', 'Passion fruit', 'Banana'), 
Money = c(10, 12, 15), purchase = FALSE)
for (p  in fruit) 
{ 
	print(p)
}

Çıktı:

## [1] "Apple" "Orange" "Passion fruit" "Banana"       
## [1] 10 12 15
## [1] FALSE

Matris Üzerinde For Döngüsü

Bir matrisin iki boyutu vardır: satırlar ve sütunlar. Bu nedenle, her hücre üzerinde yineleme yapmak için iç içe iki for döngüsüne ihtiyaç duyulur: dıştaki döngü satırlar için, içteki döngü ise sütunlar için.

# Create a matrix
mat <- matrix(data = seq(10, 20, by=1), nrow = 6, ncol =2)
# Create the loop with r and c to iterate over the matrix
for (r in 1:nrow(mat))   
    for (c in 1:ncol(mat))  
         print(paste("Row", r, "and column",c, "have values of", mat[r,c]))  

Çıktı:

## [1] "Row 1 and column 1 have values of 10"
## [1] "Row 1 and column 2 have values of 16"
## [1] "Row 2 and column 1 have values of 11"
## [1] "Row 2 and column 2 have values of 17"
## [1] "Row 3 and column 1 have values of 12"
## [1] "Row 3 and column 2 have values of 18"
## [1] "Row 4 and column 1 have values of 13"
## [1] "Row 4 and column 2 have values of 19"
## [1] "Row 5 and column 1 have values of 14"
## [1] "Row 5 and column 2 have values of 20"
## [1] "Row 6 and column 1 have values of 15"
## [1] "Row 6 and column 2 have values of 10" 

R'de Veri Çerçevesi Üzerinde For Döngüsü

Bir veri çerçevesi sütunların bir listesidir, bu nedenle basit bir for döngüsü satırları değil, sütunlarını dolaşır. Genellikle istediğiniz de budur:

df <- data.frame(a = 1:5, b = 6:10, c = 11:15)

# Loop over the columns
for (col in names(df)) {
    cat(col, 'has mean', mean(df[[col]]), '\n')
}

Çift paranteze dikkat edin. df[[col]] extracts, sütunu bir vektör olarak döndürürken, df[col] ise mean() fonksiyonunun işleyemediği tek sütunlu bir veri çerçevesi döndürür.

tuvaletping satırlar boyunca. Satır bazında yineleme mümkündür ancak yavaştır, çünkü R her geçişte satırı kopyalar:

for (r in seq_len(nrow(df))) {
    cat('Row', r, 'sums to', sum(df[r, ]), '\n')
}

Birkaç bin satırdan daha fazlası için rowSums(df), apply(df, 1, sum) veya dplyr kullanmayı tercih edin. group_by() ve summarise() Bu işlem hatlarının tamamı, kopyalama işlemi yapmadan aynı işi gerçekleştirir.

R'da For Döngüleri ve Vektörleştirme Karşılaştırması

R, vektörleştirilmiş bir dildir: operatörlerinin ve fonksiyonlarının çoğu, derlenmiş C kodunda zaten tüm vektörler üzerinde aynı anda işlem yapar. Vektörleştirilmiş bir işlemi eleman eleman tekrarlayan açık bir döngü hem daha uzun hem de daha yavaştır.

# Loop version
squares <- c()
for (i in 1:4) {
    squares[i] <- i * i
}

# Vectorized version, same result
squares <- (1:4)^2
Görev döngü Vektörleştirilmiş eşdeğer
Eleman bazlı aritmetik her bir öğe için x * 2, x + y, x^2
Her sütun için bir fonksiyon uygulayın. isimler için (df) sapply(df, mean)
Her satır için bir fonksiyon uygulayın. seq_len(nrow(df)) üzerinden uygula(df, 1, toplam)
Sonuçların bir listesini oluşturun for with list[[i]] <- … lapply(v, f)
Koşullu yeniden kodlama for, if ve else ile ifelse(koşul, a, b)

Döngü hala doğru çözüm olduğunda. Her yinelemenin önceki sonuca bağlı olduğu durumlarda, harici bir servisi çağırırken veya dosya yazarken ya da küçük bir nesnede hızdan ziyade açıklığın önemli olduğu durumlarda for döngüsünü kullanmaya devam edin.

Döngü kullanmanız gerekiyorsa, önceden bellek ayırın. Bir nesneyi döngü içinde büyütmek, R'nin onu her geçişte kopyalamasına neden olur. Öncelikle tam boyutta oluşturun:

# Slow: the vector is reallocated on every pass
out <- c()
for (i in 1:1000) out[i] <- i^2

# Fast: allocated once
out <- numeric(1000)
for (i in 1:1000) out[i] <- i^2

R'da For Döngüsü: Hızlı Referans

Bu eğitimde kullanılan her yapı aşağıda listelenmiştir:

Hedef Code
Vektör üzerinde döngü oluşturma
for (i in v) { print(i) }
İndeksler üzerinde güvenli bir şekilde döngü oluşturun.
for (i in seq_along(v)) { print(v[i]) }
Listeyi döngüyle
for (p in my_list) { print(p) }
Veri çerçevesi sütunları üzerinde döngü oluşturun.
for (col in names(df)) { print(mean(df[[col]])) }
Bir matris üzerinde döngü oluşturma
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c])
Döngüden erken çıkın
if (condition) break
Bir yinelemeyi atla
if (condition) next
Çıktıyı önceden tahsis edin
out <- numeric(n)

SSS

x boş olduğunda, 1:length(x) 1, 0 dizisini döndürür ve döngü var olmayan elemanlar üzerinde iki kez çalışır. seq_along(x) boş bir dizi döndürdüğü için döngü doğru şekilde atlanır.

Döngünün kendisi sorun değil. Sorun, döngü içinde bir nesnenin büyütülmesidir, çünkü R her geçişte nesnenin tamamını kopyalar. Sonucu önceden ayırın veya vektörleştirilmiş bir fonksiyon kullanın, böylece aradaki fark büyük ölçüde ortadan kalkar.

Sütunlar. Bir veri çerçevesi sütunların bir listesidir, bu nedenle her yineleme size bir sütunun tamamını verir. Bunun yerine satırları gezmeniz gerekiyorsa, seq_len(nrow(df)) ifadesini açıkça kullanın.

For döngüleri hiperparametre taramalarını, çapraz doğrulama katmanlarını ve eğitim dönemlerini yönlendirir. Bunların her birinin bilinen bir yineleme sayısı vardır ve for yapısı tam olarak bunun için tasarlanmıştır.

Evet. Yapay zeka asistanları, eleman bazlı döngülerin çoğunu vektörleştirilmiş veya apply-family eşdeğerlerine dönüştürebilir. Orijinalini değiştirmeden önce her iki sürümün çıktısını identical() ile karşılaştırın.

Bu yazıyı şu şekilde özetleyin: