Ana içeriğe geç

R'de "İkili operatöre sayısal olmayan argüman" Hatası Nasıl Düzeltilir

R'de ikili operatöre sayısal olmayan argüman hatası, karakter dizisi veya faktör gibi sayısal olmayan veriler üzerinde aritmetik yapmaya çalıştığınızda ortaya çıkar.
· 8 dk. oku

Yapay Zeka ile Keşfedin

R ile programlama yaparken şu hatayla karşılaşmış olabilirsiniz: Error: non-numeric argument to binary operator. Bu, karakter dizileri gibi sayısal olmayan değerler içeren veriler üzerinde matematiksel bir işlem yaparken ortaya çıkabilir.

Bu eğitimde, bu hatayla nasıl başa çıkacağınızı ve nasıl düzelteceğinizi göstereceğim. Önce kısa bir yanıt verecek, ardından bu hatanın neden oluştuğunu daha iyi anlamanız için derine ineceğim.

Kısa Cevap: R'de "İkili operatöre sayısal olmayan argüman" Hatası Nasıl Düzeltilir

Acele edenler için, R'de bu hatayı düzeltmenin yolu, aritmetik işlemlerden önce verileri sayısal tiplere dönüştürmektir. Bu yöntem, verinizdeki tüm öğelerin matematiksel hesaplamalara uygun olmasını sağlar.

Aşağıdaki örnekte as.numeric() fonksiyonu, characters vektörünü doğrudan sayısala dönüştürür ve toplama işleminin hatasız gerçekleştirilmesini garanti eder.

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Hatanın Oluşma Nedeni

R'de aritmetik işlemler sayısal veri tipleriyle çalışacak şekilde tasarlanmıştır. "İkili operatöre sayısal olmayan argüman" hatasıyla karşılaştığınızda, genellikle dize (strings) veya factors gibi sayısal olmayan veri tipleriyle aritmetik operatörlerin yanlış kullanıldığını gösterir. R veri tipleri hakkında daha fazla bilgi için R'de Veri Tipleri eğitimimizi okuyun.

Bu durum birkaç yaygın senaryoda ortaya çıkabilir:

  • Karakter Dizileri Üzerinde İşlemler: Metin verileri üzerinde aritmetik yapmaya çalışırken hata oluşabilir.
  • Faktör Veri Tipleri Üzerinde İşlemler: Özellikle verileri içe aktarırken, veri çerçeveleri içinde R'nin dizeleri faktöre dönüştürmesi beklenmedik şekilde sayısal olmayan tiplere yol açabilir ve bu hata oluşur.
  • Listeler veya Diğer Karmaşık Yapılar Üzerinde İşlemler: Listeler veya bu tür işlemlere uygun olmayan benzer yapılar üzerinde aritmetik operatörler kullanıldığında da hata oluşur.

Hatanın Yeniden Üretilmesi ve Düzeltilmesi

Bu hatanın nasıl oluşabileceğini göstermek için basit bir veri kümesi oluşturalım ve kasıtlı olarak hatayı tetikleyen işlemler yapalım. Ardından her durumda hatayı düzelteceğiz.

Karakter dizileri için hatayı nasıl yeniden üretip düzeltebilirsiniz

İlk örneğimizde, characters vektörünün öğeleri sayısal türde olmadığı, karakter dizileri olduğu için bu hata mesajını görüyoruz.

characters <- c("5", "10", "15")

result <- characters + 10

print(result)

Bunu düzeltmek için as.numeric() ile sayısala dönüştürüyoruz:

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Faktörler için hatayı nasıl yeniden üretip düzeltebilirsiniz

Sıradaki örneğimizde, faktörler için hatayı yeniden üreteceğiz.

factors <- factor(c("5", "10", "15"))

result <- factors + 10

print(result)

Bunu düzeltmek için önce karaktere, ardından sayısala dönüştürürüz. Bunu, R'de faktörlerin, karşılık gelen karakter düzeyleri olan tamsayı vektörleri olarak saklanması nedeniyle yaparız.

Bir faktörü doğrudan as.numeric() ile sayısala dönüştürdüğünüzde, R gerçek karakter değerleri yerine faktör düzeylerinin dahili tamsayı gösterimi olan alttaki tamsayı kodlarını döndürür. Önce faktörü karaktere dönüştürmek, gerçek düzeyleri karakter dizileri olarak elde eder ve bunlar daha sonra doğru şekilde sayısala dönüştürülebilir.

factors <- factor(c("5", "10", "15"))

factors <- as.numeric(as.character(factors))

result <- factors + 10

print(result)

Listeler için hatayı nasıl yeniden üretip düzeltebilirsiniz

Sıradaki örneğimizde, listeler için hatayı yeniden üreteceğiz. 

list_data <- list("5", "10", "15")

result <- list_data + 10

print(result)

Bunu düzeltmek için öğeleri çıkarıp sayısala dönüştürürüz. unlist() fonksiyonu listeyi bir vektöre dönüştürür. 

list_data <- list("5", "10", "15")

list_data <- as.numeric(unlist(list_data))

result <- list_data + 10

print(result)

Karışık veri tipleri için hatayı nasıl yeniden üretip düzeltebilirsiniz

Bu sonraki örnek biraz daha karmaşık. Önceki tekniklerimizin hiçbiri burada işe yaramazdı çünkü sayısal bir değere dönüştürülemeyen "20a" ile karşılaşırız. 

Bu durumda sapply() fonksiyonu iyi bir çözüm sunar. Belirli bir fonksiyonu vektörümüzün her bir öğesine uygular. Bizim durumumuzda, her öğeyi sayısal değere dönüştürmeye çalışan bir fonksiyon tanımlarız.

mixed_data <- list("5", 10, "15", "20a")

numeric_data <- sapply(mixed_data, function(x) {
  if (is.numeric(x)) {
    return(x)
  } else if (!is.na(as.numeric(x))) {
    return(as.numeric(x))
  } else {
    return(NA)
  }
})

result <- numeric_data + 10

print(result)

R'de fonksiyonel programlama hakkında daha fazla bilgi için purrr ile Orta Düzey Fonksiyonel Programlama kursuna göz atın. apply() ailesi hakkında daha fazlası için R Apply Ailesi Üzerine Eğitim yazımızı okuyun. 

Ek Bilmeniz Gerekenler

traceback ile hata ayıklama

Bir hata oluştuğunda, traceback() hata ayıklama için değerli bir araçtır. Hata yoluna götüren çağrı dizisini sunar ve hatanın tam noktasını belirlemenize yardımcı olur.

traceback()

Bu komutu çalıştırdıktan sonra R, hataya yol açan fonksiyon çağrılarının sırasını yazdırır. Bu, sayısal olmayan verilerin nerede dahil edilmiş olabileceğine dair fikir verebilir.

Veri giriş yöntemlerini gözden geçirin

Verilerin nasıl içe aktarıldığını tekrar kontrol etmek ve doğru şekilde dönüştürüldüğünden emin olmak isteyebilirsiniz. Verileri içe aktarırken, özellikle CSV dosyalarından, R karakter verileri otomatik olarak faktörlere dönüştürebilir. Verinizin doğru içe aktarılması için bu davranışı kontrol etmek önemlidir.

# Verilerin CSV'den yanlışlıkla faktör olarak okunduğunu varsayalım
data <- read.csv("data.csv", stringsAsFactors = TRUE)

data$column <- as.numeric(as.character(data$column))

Bu örnekte veriler, stringsAsFactors TRUE olarak ayarlanmış şekilde bir CSV dosyasından içe aktarılır. Ardından, aritmetik işlemler için uygun veri tipini sağlamak üzere faktör sütununu önce karaktere, ardından sayısala dönüştürürüz.

Hatanın Önlenmesi

Koşullu kontroller kullanma

Bu hatanın oluşmasını önlemeye yardımcı olmak için, veri tiplerinin işlemler için uygun olduğundan emin olmak üzere koşullu kontroller uygulamaya çalışın. İşlemleri gerçekleştirmeden önce veri tipini kontrol etmek ve gerekli dönüşümleri koşullu olarak ele almak iyi bir uygulamadır.

Aşağıdaki örnekte, verinin sayısal olup olmadığını kontrol ediyoruz. Değilse, aritmetik işleme geçmeden önce sayısala dönüştürüyoruz. Bu yaklaşım, yanlış veri tiplerini yakalar ve uygun şekilde sayısala dönüştürür. 

data <- "20"

if(is.numeric(data)) {
  result <- data + 10
} else {
  data <- as.numeric(data)
  result <- data + 10
}

print(result)

koşullu kontroller örneği

Sonuç ve Ek Kaynaklar

Umarım bu makale sorununuzu çözmede yardımcı olmuştur. "İkili operatöre sayısal olmayan argüman" gibi hatalar programlamada yaygındır ve bunları nasıl ele alacağınızı bilmek önemlidir. Veri tiplerini ve doğru dönüşümleri anlamak, bu hatanın oluşmasını önlemeye yardımcı olabilir.

R ile size yardımcı olması için R kopya kağıtlarımıza veya ücretsiz R'ye Giriş kursumuza göz atabilir ya da daha derin bir anlayış için R Programlama Yetenek Rotamızı deneyebilirsiniz.

Austin Chia

Yazar

Austin Chia

Ben Austin, sağlık sektöründe veri bilimci ve veri analisti olarak yıllara dayanan deneyime sahip bir blogger ve teknoloji yazarıyım. Biyoloji geçmişiyle başladığım teknoloji yolculuğumda, şimdi teknoloji blogum aracılığıyla başkalarının da aynı geçişi yapmasına yardımcı oluyorum. Teknolojiye olan tutkum, onlarca SaaS şirketine yazılı katkılar sunmama, başkalarına ilham vermeme ve deneyimlerimi paylaşmama vesile oldu.

Sıkça Sorulan Sorular

Sayısal olmayan argüman nedir?

Sayısal olmayan bir argüman, R gibi bir programlama dilinde sayı olarak yorumlanamayan değer veya değişkendir.

Bu hatayı kodumda nasıl fark edebilirim?

Hata mesajı genellikle "non-numeric argument" ifadesini içerir, bu da fark etmeyi kolaylaştırır.

Bu hata yalnızca R'de mi görülür?

Hayır, bu hata diğer programlama dillerinde de ortaya çıkabilir. Ancak hata mesajı farklı görünebilir.

Bu hatayı tamamen önlemenin bir yolu var mı?

Evet, kullanılan belirli operatörle tüm değer ve değişkenlerin uyumlu olmasını sağlayarak.

Sayısal olmayan argümanlarla herhangi bir operatörü kullanabilir miyim?

Hayır, bazı operatörler yalnızca sayısal değerlerle kullanılabilir ve sayısal olmayan argümanlar verilirse bu hataya yol açar.

Konular

İlgili