Veri çerçevesinin sütun adlarını değiştirme


399

"Newprice" adında bir veri çerçevem ​​var (aşağıya bakın) ve R'deki programımdaki sütun adlarını değiştirmek istiyorum.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

Aslında ben de bunu yapıyorum:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Ben her döngü adı gördüğünüz gibi farklı olmasını istiyorum çünkü bu bir döngü koymak değil.

Programımı R konsoluna yapıştırdığımda bu çıktıyı veriyor:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

Eşit olarak c()işlevini denedim -örneğin c("premium"), paste()işlev yerine , ama boşuna.

Birisi bunu çözmeme yardımcı olabilir mi?


Dirk'ün cevabı işe yarıyorsa sorun, veri çerçevesi yerine matrisle çalışmanızdı. Ya ile kontrol edebilirsiniz is.matrixya str.
— IRTFM

3
Bu yanıta bakınız dplyr :: rename stackoverflow.com/a/26146202/1831980
— Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
— Tung Nguyen

Hatanızın kodunuzun kalitesi ile ilgisi yoktur. Sadece yanlış sembolü kullanıyorsunuz. Bu "R tarafından tanınmıyor, onun yerine" kullanın. Aynı görünebileceklerini biliyorum. Yakından bak: "". Bu kadar.
— Edo

Yanıtlar:


594

colnames()İşlevi kullanın :

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

Ayrıca alt kümeleri de ayarlayabilirsiniz:

R> colnames(X)[2] <- "superduper"

12
@Dirk Neden colnames () yerine names () kullanılmıyor?
— Antoine Lizée

4
Harika! Aynı anda birden çok sütunu alt kümeye de ayarlayabilirsiniz (büyük veri çerçevelerinde faydalıdır). colnames(X)[c(1,2)] <- c("good", "better")
— metakermit

7
Deneyin setnames()içinde data.tablepaketin. Gibi kullanın şey setnames(DT,"b","B")yasetnames(DT,c("a","E"),c("A","F"))
— dwstu

Garip bir şekilde, veri çerçevesinin sütun adlarını ayarladıktan sonra, hatadaki sonuçlarda olduğu gibi q1veri çerçevesini değiştirmeye çalışın (burada sütuna yeni bir ad verilir). Bu gerçekten sinir bozucu. dplyrq1 <- q1 %>% mutate(rel_count = count / 482462)Error in mutate_impl(.data, dots) : unknown column 'days'days
— David Tonhofer

176

Bunu kullanıyorum:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

7
Teşekkür ederim. Sanırım bu bir şekilde R ile sinir bozucu: Dizin numarasını değil, eski adı kullanmak istemiyorsanız sütun adını değiştirmek neden bu kadar zor :(
— Arne

10
Bu yöntemin avantajı, orijinal adını bildiğiniz sürece sütunun konumu hakkında endişelenmenize gerek olmamasıdır. Ben - daha sonra - yeniden adlandırmak istediğiniz sütunun konumunu değiştiren kodda değişiklik yapabilirsiniz gibi bu tercih edilen yöntem olduğunu düşünüyorum.
— Paulo S. Abreu

78

Hata "akıllı tırnaklar" (veya bunlara ne denirse) neden olur. Buradaki ders, "kodunuzu tırnak işaretlerini akıllı tırnaklara dönüştüren bir" düzenleyiciye "yazmayın.

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

Ayrıca, paste("premium")(çağrı çağrısı pastegereksiz) gerekmez ve <-karışıklığı önlemek için boşluklar koymak iyi bir fikirdir (örn. x <- -10; if(x<-3) "hi" else "bye"; x).


51

Sadece denedin mi:

names(newprice)[1]<-"premium"

?


42

Bunu yapmanın önerilen yeni yolu setNamesişlevi kullanmaktır . Bkz ?setNames. Bu, öğesinin yeni bir kopyasını oluşturduğundan, niyetiniz buysa data.framesonucu orijinaline atadığınızdan emin olun data.frame.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

R'nin daha yeni sürümleri, colnamesÖnceki yanıtların önerdiği yöntemlerden bazılarını .

Bu bir olsaydı data.tablebunun yerine şunu kullanabilirsiniz data.tableişlevi setnamesbelirli sütun adları veya tek sütun adını değiştirebilir, hangi referansla :

setnames(data_table, "old-name", "new-name")

2
data.table değil, data.frame istendiğini düşünüyorum
— Helix123

35

Ben de aynı sorunu vardı ve bu kod parçası benim için çalıştı.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

Kısacası, bu kod aşağıdakileri yapar:

names(data)veri alanındaki tüm isimlere bakar ( data)

[names(data) == oldVariableName]oldVariableNameyeniden adlandırılmak istediğiniz değişken adını ( ) ayıklar ve <- "newVariableName"yeni değişken adını atar.


örneğin 3 oldVariableNames ile bir vektörünüz olsaydı bu nasıl olurdu?
— jiggunjer

Tam olarak ne aradığını -> 2 Yaşasın !!
— SilSur

19

Diğerlerine benzer:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Oldukça basit ve kolay değiştirilebilir.


10

Deneyin:

names(newprice) <- c("premium", "change", "newprice")

10

Yalnızca eski sütun adlarını bildiğinizde birden çok sütunu değil birden fazlasını yeniden adlandırmanız gerekiyorsa colnamesişlevi ve %in%işleci kullanabilirsiniz . Misal:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Şimdi "kötü" ve "en kötü" yi "iyi" ve "en iyi" olarak değiştirmek istiyorsunuz. Kullanabilirsiniz

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Bu sonuç

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
Bu kod, sütun adlarınızın sıralamasının eklerin sıralamasına eşit olduğunu varsayar
— Hillary Sanders

10

Sütun adını colname işlevine göre değiştirmek için bunu kullanın.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

Düzenlemeyi sadece şu şekilde yapabilirsiniz:

newprice <- edit(newprice)

ve sütun adını manuel olarak değiştirin.


Bu sadece vektör ve faktör öğeleri için geçerli değil mi? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
— vagabond

En azından veri çerçeveleri için çalışır. Bunu biliyorum.
— Baykal

7

Sütun isimlerim aşağıdaki gibidir

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Sınıf ve Cinsiyet sütun adını değiştirmek istiyorum

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

dplyr::rename()Ve ile birkaç seçenek vardır dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

Ayrıca üç kapsamlı değişken vardır dplyr::rename(): dplyr::rename_all()tüm sütun adları dplyr::rename_if()için, koşullu olarak sütun adlarını hedeflemek ve dplyr::rename_at()adlandırılmış sütunları seçmek için. Aşağıdaki örnek, boşlukları ve dönemleri bir alt çizgi ile değiştirir ve her şeyi küçük harfe dönüştürür:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() benzer bir şekilde de kullanılabilir:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

Scott Wilson'ın cevabını düzeltmek ve biraz uzatmak için.
Data.table kullanabilirsinizsetnames işlevini üzerinde de kullanabilirsiniz.

İşlemin hızlanmasını beklemeyin, ancak setnamessütun adlarını referans olarak güncellediğinden bellek tüketimi için daha verimli olmasını bekleyebilirsiniz . Bu addressişlevle izlenebilir , aşağıya bakın.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Bellek sınırlarınızı vuruyorsanız, bunun yerine bunu kullanmayı düşünebilirsiniz.


3

Bu yardımcı olabilir:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

2 veri çerçevemiz olması durumunda aşağıdaki işler

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

DF1'in adlarını aşağıdaki gibi değiştiriyoruz

 colnames(DF1)<- colnames(DF2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.