Bir data.frame içinde tek bir sütun nasıl yeniden adlandırılır?


335

1'den fazla sütuna sahip bir veri çerçevem ​​varsa biliyorum

colnames(x) <- c("col1","col2")

sütunları yeniden adlandırmak için. Yalnızca bir sütunsa bunu nasıl yapabilirim? İçinde yalnızca bir sütun bulunan bir vektör veya veri çerçevesi anlamına gelir.

Misal:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
@ aix'in çözümü 1 sütunluk bir veri çerçevesi için çalışacaktır. Muhtemelen, drop=TRUEvarsayılan argümanla karıştırılırsınız [, bu da "1 sütunlu" bir nesnenin bir vektöre dönüştürülmesine neden olur ... ve vektörlerde yoktur colnames. Denediğinizin bir örneği çok yardımcı olacaktır.
Joshua Ulrich

2
"colnames (x) [1] <- 'newname2'" kullanırsanız çalışır
screechOwl

Yanıtlar:


344
colnames(trSamp)[2] <- "newname2"

ikinci sütunun adını ayarlamaya çalışır. Nesnenizin yalnızca bir sütunu vardır, bu nedenle komut bir hata atar. Bu yeterli olmalıdır:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Sütun adı kullanmak "A,B,C,X,Y,Z"için yeniden adlandırmak istediğim yere benziyorsa, bu işe yaramaz gibi görünüyor . YtestData[379] <- "Y"
Chetan Arvind Patil

576

Bu, değişkenin tam yerini hatırlamak zorunda olmadığınız genel bir yoldur:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Bu kod hemen hemen aşağıdakileri yapar:

  1. names(df) içindeki tüm isimlere bakar df
  2. [names(df) == old.var.name] kontrol etmek istediğiniz değişken adını çıkarır
  3. <- 'new.var.name' yeni değişken adını atar.

5
Ben de R ile oldukça yeniyim, bu çözümü sevdim! Aslında ne yaptığını kontrol ettim ve [names(df) == old.var.name]gerçekten doğru / yanlış değerlerle bir vektör döndürdüğünü belirtmeye değer olduğunu düşünüyorum . Dolayısıyla, örneğin normal ifadeler kullanılırsa birden çok sütun adını değiştirme potansiyeli vardır.
mikyatope

3
Normal ifade sonuçları için benzer bir şey kullanın names(df) = sub('pattern', 'replacement', names(df)). Aksi takdirde, aynı ada birden çok sütun ayarlamaya çalışıyorsunuzdur.
Hepimiz Monica

40
Karışık duygular ... mükemmel programlama dillerinin bol olduğu mükemmel bir dünyada, tek bir sütunun adını değiştirmek için gerçekten bu kadar çok tuşa basmak gerekir mi? R'yi seviyorum ama bazen bu tür nedenlerden dolayı boğmak istiyorum.
tumultous_rooster

4
Tabanda bunun için bir sarmalayıcı işlevi nasıl yoktur?
ifly6

1
Hepimiz nasıl diliyoruz! Ben şimdi bilmiyorum, ama o zamanlar üssünde herhangi bir sarıcı yoktu
Side_0o_Effect 20:08

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
Sütun adına, hangi sayı sütununun olduğunu bilmenin aksine, isme göre başvurabileceğiniz için bu çözümü beğendim. Daha büyük sayı özellikleri için daha iyi.
Sibernetik

1
Soruyu ve bu cevabı küçük bir uzantısı var. İçinde 'snp' harfleri olan bir sütun içeren bir veri çerçevesi var. Adı 'Marker' olarak değiştirmek istiyorum . Ama bunu yapmak için düzenli bir ifade kullanmak istiyorum . Görünüşe göre sahip olduğum kod kusurlu:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"çünkü sütun yeniden adlandırılmaz. Ben yaparsanız names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"o olduğunu değiştirildi. Neyi kaçırıyorum?
Sander W. van der Laan

76

Bu eski bir soru, ama şimdi kullanabilirsiniz dikkati çekiyor setnamesgelen data.tablepaketin.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
veya setNamesR tabanından
PatrickT

53

Bu Hadley'in plyrpaketi ve renameişlevi kullanılarak da yapılabilir .

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

İsme göre yeniden adlandırabilirsiniz (konumu bilmeden) ve aynı anda birden fazla yeniden adlandırma gerçekleştirebilirsiniz. Örneğin, birleştirme yaptıktan sonra aşağıdakilerle sonuçlanabilir:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Daha sonra aşağıdakileri kullanarak bir adımda yeniden adlandırabilirsiniz:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renameartık dplyrpaketteki bir işlevdir .
Sam Firke

36

Ben sütun yeniden adlandırmanın en iyi yolu böyle dplyr paketi kullanarak olduğunu düşünüyorum :

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Herhangi bir veri kümesinde bir veya daha fazla sütunu yeniden adlandırmak için aynı şekilde çalışır.


12

Dataframe sütun adlarını tek tek yeniden adlandırmak için bir sonraki stili beğendim.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

nerede

which(colnames(df) == 'old_colname')

Belirli bir sütunun dizinine göre döndürür.


1
Kullanıcıya gerçek eski adı kullanma şansı verdiğiniz için +1

1
@Zongshiwujie'nin çözümüne kıyasla burada fark nedir?
buhtz

which()gerekli değil.
sindri_baldur

12

Tek bir sütunu yeniden adlandırmanın en uygun yolunun kullandığını görüyorum dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • boru zincirlerinde iyi çalışır
  • isimler değişkenlerde saklandığında kullanışlıdır
  • bir ad veya sütun dizini ile çalışır
  • temiz ve kompakt

6

Paketin rename.varsiçinde kullanabilirsiniz gdata.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Bu, değiştirmek için birden fazla değişken adınız olduğunda veya değişken adlarına bazı metinler eklemek veya önceden eklemek istediğinizde özellikle yararlıdır, o zaman şöyle bir şey yapabilirsiniz:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Değişken adlarının bir alt kümesine metin ekleme örneği için bkz: https://stackoverflow.com/a/28870000/180892


Bu en kolayı, teşekkürler. Dplyr paketi ile ilgili sorunlar vardı.
DannyB

4

Deneyin:

colnames(x)[2] <- 'newname2'

8
Bu OP'nin sorduğu hatayı attı (düzenlemesinde). Veri çerçevesinin yalnızca bir sütunu olduğundan çalışmaz.

. @ NPE - Sütun adı kullanmak "A,B,C,X,Y,Z"için yeniden adlandırmak istediğim yere benziyorsa, bu işe yaramıyor gibi görünüyor . YtestData[379] <- "Y"
Chetan Arvind Patil

4

Bu muhtemelen zaten orada, ama bir çözüm ararken alanları yeniden adlandırmakla oynuyordum ve bunu bir hevesle denedim. Benim amacım için çalıştı.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

Düzenleme burada başlıyor ....

Bu da işe yarıyor.

df <- rename(df, c("oldColName" = "newColName"))

Beni kim işaretlediyse, bu iyi, ama bunu yapmak için açık bir şekilde yeni olduğumdan, belki de cevapta neyin yanlış olduğu konusunda aydınlanabilirsiniz.
Scottieie

Cevabınızla ilgili yanlış bir şey yok, bunun yanı sıra bir oneliner olmuyor .. bu sadece öfke nöbetini haklı gösterecek cesarete sahip olmayan düşmanca bir SO kullanıcısıydı.
sayım0

Teşekkürler @ count0. Aslında bazı mana puanlarına sahip olmak ya da bir soru hakkında yorum yapmak için ne varsa, henüz yapamadığım bir şey olması anlamlıdır. Bazı durumlarda takip soruları, yeni bir beceri seti öğrendiğim için iyi olurdu. Tekrar. TY.
Scottieie

1
Bunu kullanmak için tüm sütunların adını vermeliyiz.
Arpit Sisodia

renamefonksiyon hangi paketten geliyor?
Diego

3

Veri çerçevenizde yalnızca bir sütun olduğunu biliyorsanız şunları kullanabilirsiniz: names(trSamp) <- "newname2"


3

'Hmisc' paketinden 'upData' öğesini de deneyebilirsiniz.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


Çok hoş! Aynı anda daha fazla sütunu yeniden adlandırmak da mümkündür: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

OP'nin sorusu iyi ve gerçekten cevaplandı. Ancak, bazı durumlarda yararlı olabilecek bir hile: bir veri çerçevesindeki konumundan bağımsız olarak sütun adının kısmi eşleşmesi:

Adda kısmi eşleme:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Başka bir örnek: "noktalama işaretleri" ifadesinin kısmi eşleşmesi:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Bunlar bugün uğraşmak zorunda olduğum örneklerdi, paylaşmaya değer olabileceğini düşündüm.



0

rename_withSütunları bir işlevle yeniden adlandırmak için kullanabiliriz ( stringrörneğin işlevler).

Aşağıdaki verileri göz önünde bulundurun df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Tüm değişkenleri şununla yeniden adlandır dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Tarafından yeniden adlandırma adı parçacık bazı dplyrfiiller ( starts_with, ends_with, contains, matches, ...).

.( xDeğişkenler) ile örnek :

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Tarafından yeniden adlandırma sınıfın sınıf testi birçok fonksiyonları ile, gibi is.integer, is.numeric, is.factor...

is.integer( y) İle örnek :

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

Uyarı:

Uyarı mesajları: 1: stri_replace_first_regex'te (dize, desen, fix_replacement (değiştirme),: daha uzun nesne uzunluğu, daha kısa nesne uzunluğu 2'nin katı değildir: [cols] <- .fn (names [cols], ...) : değiştirilecek öğe sayısı değiştirme uzunluğunun katı değil

seq_along(.)Değiştir işleviyle sadece tutarsızlığı olduğu için ilgili değildir .


-1

Sadece veri çerçevesine istediğim adla yeni bir sütun ekler ve mevcut sütundan veri alırım. bunun gibi:

dataf$value=dataf$Article1Order

o zaman eski sütunu kaldırıyorum! bunun gibi:

dataf$Article1Order<-NULL

Bu kod aptalca görünebilir! Ama mükemmel çalışıyor ...


-1

Ben sadece aşağıdaki kodla istediğim yeni adla veri kümesine bir sütun adı değiştirmek istiyorum: names (dataset) [index_value] <- "new_col_name"


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.