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.