Önce Adları Görün: names() ve colnames()
Sütun adları, herhangi bir vektör gibi okuyabileceğiniz bir öznitelikte yaşar. names() ve colnames(), bir veri çerçevesi için ikisi de bunu döndürür:
Aynı sonuç. Tek gerçek fark: colnames() matrislerde de çalışır, names() çalışmaz - bu yüzden genel amaçlı kodlar colnames() kullanır. Günlük veri çerçevelerinde birbirlerinin yerine geçebilirler.
Aşağıdaki her şeyin anahtar fikri: bir sütunu yeniden adlandırmak, bu vektöre atama yapmaktır. Bunun için özel bir temel R fonksiyonu yoktur; names(df)'i herhangi bir vektörde kullandığınız indekslemeyle değiştirirsiniz.
Konuma Göre Yeniden Adlandırma (Çalışır, Ama Kırılgan)
Adlar vektörünü konuma göre indeksleyin ve atayın:
- sütun artık
price. Hızlı bir etkileşimli düzeltme için uygundur - bir betikte ise tuzaktır. Konumlar, sütun sırası hakkında bir vaattir ve sütun sırası, içe aktarılan verilerin en az kararlı yönüdür: okuduğunuz CSV fazladan bir sütun kazandığı gün,names(df)[2]sessizce yanlış sütunu yeniden adlandırır. Bir betik konuma göre yeniden adlandırıyorsa, bir şema değişikliği onu hata mesajı olmadan bozar.
Ada Göre Yeniden Adlandırma (Sağlam Temel R Deyimi)
Bir konuma güvenmek yerine eski adı eşleştirin:
Önce iç kısmı okuyun: names(sales) == "prc", FALSE TRUE FALSE üretir - adlar vektörü üzerinde bir mantıksal maske. Onunla indekslemek eşleşen girdiyi seçer ve atama onu değiştirir. "prc" orada yoksa hiçbir şey eşleşmez ve hiçbir şey değişmez (hata yok - bu yüzden sonucu kontrol edin). Bu deyim, yeniden sıralamaya, eklenen sütunlara ve başka betiklere kopyala-yapıştıra dayanıklıdır. Ezberleyin; "bir sütunu yeniden adlandır" sorusunun temel R yanıtı budur.
Tek Seferde Birkaç Sütun
Her sütunu adlandırırken (içe aktarmadan hemen sonra yaygındır) tüm vektörü değiştirin ya da seçili bir alt kümeyi yeniden adlandırmak için match() kullanın:
match(old, names(df)), eski adların konumlarını döndürür, böylece yeni adlar tam olarak eskilerinin olduğu yere yerleşir - tek ad deyimi gibi sıraya karşı güvenlidir. Eski adlardan herhangi biri eksikse, match() NA döndürür ve atama hata verir - istediğiniz başarısızlık şekli tam olarak budur: gürültülü.
İşlem Hatları için setNames()
Yukarıdaki tüm deyimler bir değişkeni iki adımda değiştirir. setNames(object, names), tek bir ifadede yeniden adlandırılmış bir kopya döndürür - bir işlem hattının istediği tam da budur:
Bir fonksiyon adsız veya kötü adlandırılmış bir çerçeve döndürdüğünde ve bunu satır içinde düzeltmek istediğinizde kullanışlıdır - read_something() |> setNames(c("id", "value")) - geçici bir değişken olmadan.
dplyr Yolu: rename() ve rename_with()
dplyr'ın rename() fonksiyonu new = old çiftleri alır - önce yeni ad; bunu herkes en az bir kez ters yazar (statik; kum havuzu yalnızca temel R çalıştırır):
library(dplyr)
sales |> rename(price = prc, qty = q)
Çağrıda dokunulmayan eski adlar olduğu gibi korunur ve yanlış yazılmış bir eski ad, sessiz bir işlemsizlik yerine kesin bir hatadır - temel R deyimine göre gerçek bir iyileştirme. Çiftler yerine kurala göre yeniden adlandırmak için rename_with(), adlara bir fonksiyon uygular:
sales |> rename_with(toupper) # every column
sales |> rename_with(toupper, starts_with("p")) # just some
Bunların fiil ailesine nasıl oturduğu için dplyr girişine bakın.
Dağınık İçe Aktarılan Başlıkları Temizleme
Gerçek CSV başlıkları "Order ID", "unit.price ($)", "2024 Total" olarak gelir - her yerde ters tırnak kullanmayı zorlayan, boşluklu ve simgeli adlar. Temel R'ın make.names() fonksiyonu, herhangi bir karakter vektörünü geçerli R adlarına dönüştürür:
Geçerli, ama kendi tarzında çirkin (X2024.Total). Bu yüzden birçok ekip, tek çağrıda düzenli snake_case (order_id, unit_price, x2024_total) üreten janitor paketinin clean_names() fonksiyonunu standart olarak benimser: df |> janitor::clean_names(). Her hafta dağınık dosyalar içe aktarıyorsanız, kendini hemen amorti eder.
Öğrendikleriniz
- Sütun adları yalnızca bir vektördür:
names()/colnames()ile okuyun, içine atama yaparak yeniden adlandırın. names(df)[2] <- "new"kırılgandır; ezberlenecek deyimnames(df)[names(df) == "old"] <- "new"deyimidir.match()birkaç sütunu ada göre yeniden adlandırır;setNames()bir işlem hattında satır içi yeniden adlandırır.- dplyr'ın
rename(new = old)fonksiyonu eksik adlarda hata verir (iyi) verename_with()kurala göre yeniden adlandırır. - Dağınık içe aktarılan başlıklar için: temel R'da
make.names(), güzel sonuçlar içinjanitor::clean_names().
Sırada: sıralama - vektörler için sort(), veri çerçeveleri için order() hilesi ve arrange().
Sıkça Sorulan Sorular
R'da bir sütunu nasıl yeniden adlandırırım?
Sağlam temel R deyimi ada göre eşleştirmektir: names(df)[names(df) == "old"] <- "new". old adlı sütunu nerede olursa olsun bulur ve yeniden adlandırır. dplyr'da rename(df, new = old) şeklindedir - sıraya dikkat: önce yeni ad.
names() ile colnames() arasındaki fark nedir?
Bir veri çerçevesinde pratik olarak hiçbir fark yoktur - ikisi de sütun adlarını okur ve ayarlar. colnames() matrislerde de çalışır (names() çalışmaz), bu yüzden her ikisini de işlemesi gereken kodlar colnames() kullanma eğilimindedir. Düz veri çerçevelerinde hangisini isterseniz kullanın.
R'da bir sütunu konuma göre nasıl yeniden adlandırırım?
Adlar vektörünün o konumuna atama yapın: names(df)[2] <- "price" ikinci sütunu yeniden adlandırır. Çalışır, ama kırılgandır - bir sütun eklendiği veya CSV'nin sütun sırası değiştiği gün, 2. konum farklı bir sütundur. Ada göre yeniden adlandırmayı tercih edin.
R'da birden fazla sütunu tek seferde nasıl yeniden adlandırırım?
Tam bir vektör atayın: names(df) <- c("id", "name", "price") tüm adları sırayla değiştirir. Seçili birkaç sütunu ada göre yeniden adlandırmak için match() kullanın: names(df)[match(c("old1", "old2"), names(df))] <- c("new1", "new2"). dplyr'da: rename(df, new1 = old1, new2 = old2).