Menu

R'da Sütun Ekleme ve Dönüştürme (mutate ve Temel R)

Veri çerçevesi sütunlarını ekleme, dönüştürme ve silme: df$new <- ..., koşullu sütunlar için ifelse(), transform() ve dplyr'ın case_when() ile mutate() fonksiyonu.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Sütun Ekleme: df$new <- değer

Temel R'da sütun eklemek için henüz var olmayan bir ada atama yapın. Değer genellikle var olan sütunlardan hesaplanır:

İki şey oldu. orders$total tam bir vektör aldı - R'da aritmetik vektörleştirilmiş olduğu için price * qty her satır için tek seferde hesaplanır. orders$currency tek bir değer aldı ve R bunu dört satıra da geri dönüştürdü. Başka herhangi bir uzunluk hatadır (replacement has 3 rows, data has 4) - bu, R'ın sizi hizasız bir sütundan korumasıdır.

Bu çalışır çünkü bir veri çerçevesi, eşit uzunlukta sütunlardan oluşan bir listedir - yeni adlandırılmış bir öğe atamak listeyi büyütür. Veri çerçeveleri dokümanı bu modeli açar.

Koşullu Sütunlar: ifelse()

Değeri bir koşula bağlı olan bir sütun ifelse() ister - if'in vektörleştirilmiş kuzeni. Koca bir koşul vektörü alır ve satır başına bir değer döndürür:

Neden düz if değil? Çünkü if tam olarak tek bir TRUE/FALSE değerlendirir - ona bir sütun verilirse hata verir (the condition has length > 1). ifelse(test, yes, no) her öğeyi kontrol eder ve satır başına seçer. Üç veya daha fazla sonuç için iç içe koyabilirsiniz:

İki katman iç içe geçme sorun değil; üç veya daha fazlası bir piramide dönüşür - dplyr'ın case_when() fonksiyonu (aşağıda) tam da bu iş için yapıldı. Tek değerli if/else ise if-else dokümanında ele alınıyor.

Tek Seferde Birden Fazla Sütun: transform()

Temel R'ın transform() fonksiyonu, çıplak sütun adlarıyla tek çağrıda birden fazla sütun ekler:

transform() fonksiyonunun yeni bir veri çerçevesi döndürdüğüne dikkat edin - sonucu geri atamak zorundasınız; df$new <- ... ise yerinde değiştirir. Bir sınırlama: tek bir transform() çağrısı içindeki ifadeler birbirini göremez, bu yüzden orada discount = ifelse(total > 50, ...) başarısız olur (total henüz mevcut değil). Bunu iki adımda yapın - ya da buna izin veren mutate() ile.

Değiştirme ve Oluşturma

Aynı atama sözdizimi var olan bir sütunun üzerine yazar - tek fark o sütunun zaten var olup olmamasıdır:

Bunun üzerinde durmaya değer: R, bir sütunun üzerine yazdığınızda size uyarı vermez. df$prise <- round(df$price, 2) gibi bir yazım hatası, eskisini düzeltmek yerine sessizce yeni bir sütun oluşturur. Bir dönüşümden sonra çerçeveyi print() veya str() ile kontrol edin ve değiştirmek istediğinizi değiştirdiğinizden emin olun.

Sütun Silme

Silmek için NULL atayın:

Sütun gitti, hiç tören yok. Birkaç sütunu birden silmek için, tekrarlanan NULL'lar yerine df[, c("a", "b")] (listelediklerinizi tutun) genellikle daha nettir.

dplyr Yolu: mutate()

Yukarıdakilerin tümü için dplyr'ın fiili mutate()'tir. Aşağıdaki kod parçaları statiktir - kum havuzu yalnızca temel R çalıştırır - ama aynı işlemler şöyle görünür:

library(dplyr)

orders |>
    mutate(
        total    = price * qty,
        big      = total > 50        # can use total, defined one line up
    )

Temel R'a göre iki avantaj. Birincisi, aynı mutate() içinde tanımlanan sütunlar sırayla birbirine referans verebilir - transform()'un reddettiği şey. İkincisi, koşullu yardımcılar iç içe ifelse()'ten daha iyidir:

students |>
    mutate(
        grade = if_else(score >= 60, "pass", "fail"),
        band  = case_when(
            score >= 85 ~ "high",
            score >= 60 ~ "mid",
            .default    = "low"
        )
    )

if_else(), daha katı bir ifelse()'tir (her iki dal da aynı türde olmalıdır - gerçek hataları yakalar). case_when(), yukarıdan aşağıya kontrol edilen düz bir koşul ~ değer çifti listesi olarak okunur, .default ise geri dönüş değeridir - ifelse() piramidinin okunabilir alternatifi. Her dplyr fiili gibi mutate() de yeni bir veri çerçevesi döndürür; geri kalanıyla nasıl zincirlendiği için dplyr girişine bakın.

Öğrendikleriniz

  • df$new <- ifade bir sütun ekler; ifade her satır için tek seferde çalışır.
  • ifelse(test, yes, no) koşullu sütunlar kurar; düz if bunu yapamaz.
  • transform() çağrı başına birkaç sütun ekler ama bunlar birbirini göremez; mutate() görebilir.
  • Aynı atama sessizce üzerine yazar - bir dönüşümden sonra yazımınızı kontrol edin.
  • df$col <- NULL bir sütunu siler; case_when(), iç içe ifelse() piramitlerinin yerini alır.

Sırada: sütunları yeniden adlandırma - names(), sağlam temel R deyimi ve dplyr'ın rename() fonksiyonu.

Sıkça Sorulan Sorular

R'da bir veri çerçevesine yeni bir sütunu nasıl eklerim?

Henüz var olmayan bir sütun adına atama yapın: df$total <- df$price * df$qty. R sütunu anında oluşturur. Değer, tek bir değer (her satıra geri dönüştürülür) ya da uzunluğu satır sayısıyla eşleştiği sürece diğer sütunlardan hesaplanan bir vektör olabilir.

R'da koşullu bir sütunu nasıl oluştururum?

Vektörleştirilmiş ifelse() kullanın: df$grade <- ifelse(df$score >= 60, "pass", "fail") her satırı tek seferde kontrol eder. Düz if kullanmayın - o bir sütunu değil, tek bir koşulu işler. İkiden fazla sonuç için ifelse() çağrılarını iç içe koyun veya dplyr'ın case_when() fonksiyonunu kullanın.

R'da mutate() ne yapar?

mutate(), dplyr'ın sütun ekleme veya dönüştürme fiilidir: df |> mutate(total = price * qty), veri çerçevesinin yeni sütunlu bir kopyasını döndürür. Tek çağrıda birden fazla sütun tanımlayabilir ve sonraki sütunlar aynı mutate içinde tanımlanan öncekileri kullanabilir.

R'da bir veri çerçevesinden bir sütunu nasıl silerim?

Ona NULL atayın: df$notes <- NULL sütunu yerinde kaldırır. dplyr'da select(-notes), o sütun olmadan bir kopya döndürür.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA