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.

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.

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) |
