Jak zmienić nazwę pojedynczej kolumny w ramce data.frame?


335

Wiem, że jeśli mam ramkę danych z więcej niż 1 kolumną, mogę użyć

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

zmienić nazwy kolumn. Jak to zrobić, jeśli jest to tylko jedna kolumna? Oznacza wektor lub ramkę danych z tylko jedną kolumną.

Przykład:

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
Rozwiązanie @ aix będzie działać dla 1-kolumnowej ramki danych. Prawdopodobnie jesteś zdezorientowany drop=TRUEdomyślnym argumentem [, który powoduje, że obiekt „1-kolumnowy” jest konwertowany na wektor ... a wektory tego nie mają colnames. Przykład tego, co próbowałeś, byłby bardzo pomocny.
Joshua Ulrich,

2
działa, jeśli użyjesz "colnames (x) [1] <- 'newname2'"
screechOwl 23.09

Odpowiedzi:


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

próbuje ustawić nazwę drugiej kolumny. Twój obiekt ma tylko jedną kolumnę, więc polecenie zgłasza błąd. To powinno wystarczyć:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - nie wydają się działać, jeśli nazwa kolumny jest coś podobnego "A,B,C,X,Y,Z", gdzie chcę, aby zmienić jego nazwę na Yużyciu testData[379] <- "Y".
Chetan Arvind Patil

576

Jest to uogólniony sposób, w jaki nie musisz pamiętać dokładnej lokalizacji zmiennej:

# 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'

Ten kod wykonuje następujące czynności:

  1. names(df) sprawdza wszystkie nazwy w df
  2. [names(df) == old.var.name] wyodrębnia nazwę zmiennej, którą chcesz sprawdzić
  3. <- 'new.var.name' przypisuje nową nazwę zmiennej.

5
Jestem również całkiem nowy z R, podobało mi się to rozwiązanie! Rzeczywiście sprawdziłem, co robi i myślę, że warto określić, że [names(df) == old.var.name]faktycznie zwraca wektor z wartościami prawda / fałsz. Może więc zmieniać wiele nazw kolumn, jeśli na przykład używane są wyrażenia regularne.
mikyatope,

3
Aby uzyskać wyniki wyrażeń regularnych, użyj czegoś takiego names(df) = sub('pattern', 'replacement', names(df)). W przeciwnym razie próbujesz ustawić wiele kolumn pod tą samą nazwą.
We Are All Monica

40
Mieszane uczucia ... w idealnym świecie, w którym występuje mnóstwo języków programowania, czy naprawdę wymagałoby tak wielu naciśnięć klawiszy, aby zmienić nazwę pojedynczej kolumny? Uwielbiam R, ale czasami chcę go udusić z tego rodzaju powodów.
tumultous_rooster

4
Jak nie ma funkcji otoki dla tego w bazie?
ifly6

1
Jak wszyscy sobie życzymy! Nie wiem teraz, ale wtedy nie było żadnego opakowania w podstawie
Side_0o_Effect

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

2
Podoba mi się to rozwiązanie, ponieważ możesz odwoływać się do nazwy kolumny według nazwy, a nie wymagać, aby była to kolumna liczbowa. Lepsze dla większej liczby funkcji.
Cybernetyczny

1
Mam małe rozszerzenie do pytania i tej odpowiedzi. Mam ramkę danych z kolumną zawierającą litery „snp” . Chcę zmienić nazwę na „Marker” . Ale chcę użyć do tego wyrażenia regularnego . Najwyraźniej kod, który mam, jest wadliwy: colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"ponieważ nazwa kolumny nie została zmieniona. Jeśli to zrobię names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker", zostanie zmieniona nazwa. czego mi brakuje?
Sander W. van der Laan

76

To stare pytanie, ale warto zauważyć, że możesz teraz korzystać setnamesz data.tablepakietu.

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
lub setNamesz bazy R.
PatrickT

53

Można to również zrobić za pomocą plyrpakietu Hadleya i renamefunkcji.

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

Możesz zmienić nazwę według nazwy (bez znajomości pozycji) i wykonywać wiele nazw jednocześnie. Na przykład po scaleniu możesz uzyskać:

  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

Które można następnie zmienić w jednym kroku za pomocą:

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
renamejest teraz również funkcją w dplyrpakiecie.
Sam Firke,

36

Myślę, że najlepszym sposobem na zmianę nazw kolumn jest użycie pakietu dplyr w następujący sposób:

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

Działa to samo w przypadku zmiany nazwy jednej lub wielu kolumn w dowolnym zestawie danych.


12

Podoba mi się kolejny styl zmieniania nazw kolumn danych ramki danych jeden po drugim.

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

gdzie

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

zwraca przez indeks określonej kolumny.


1
+1 za umożliwienie użytkownikowi użycia aktualnej starej nazwy :)

1
Jaka jest tutaj różnica w porównaniu z rozwiązaniem @zongshiwujie?
buhtz

which()to nie jest konieczne.
sindri_baldur

12

Uważam, że najwygodniejszym sposobem zmiany nazwy pojedynczej kolumny jest użycie 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
  • działa dobrze w łańcuchach rurowych
  • wygodne, gdy nazwy są przechowywane w zmiennych
  • współpracuje z nazwą lub indeksem kolumny
  • przejrzysty i zwarty

6

Możesz użyć rename.varsw gdatapakiecie.

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

Jest to szczególnie przydatne, gdy musisz zmienić więcej niż jedną nazwę zmiennej lub chcesz dołączyć lub wstępnie wstawić tekst do nazw zmiennych, a następnie możesz zrobić coś takiego:

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

Przykład dołączania tekstu do podzbioru nazw zmiennych można znaleźć na stronie : https://stackoverflow.com/a/28870000/180892


To jest najłatwiejsze, dzięki. Miałem problemy z pakietem dplyr.
DannyB

4

Próbować:

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

8
Właśnie to rzuciło błąd, o który OP pytał (w swojej edycji). To nie zadziała, ponieważ ramka danych ma tylko jedną kolumnę.

. @ NPE - nie wydają się działać, jeśli nazwa kolumny jest coś podobnego "A,B,C,X,Y,Z", gdzie chcę, aby zmienić jego nazwę na Yużyciu testData[379] <- "Y".
Chetan Arvind Patil

4

Prawdopodobnie już tam jest, ale bawiłem się przemianowaniem pól, szukając rozwiązania i próbowałem tego na kaprysu. Pracowałem dla moich celów.

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

Edycja zaczyna się tutaj ....

To też działa.

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

Dla każdego, kto mnie oznaczył, to jest w porządku, ale ponieważ jestem oczywiście nowy w robieniu tego, być może mógłbyś wyjaśnić, co było nie tak z odpowiedzią.
Scottieie

Nie ma nic złego w twojej odpowiedzi, poza tym, że nie jest onelinerem ... to był po prostu wrogi użytkownik SO, który nie miał odwagi uzasadnić swojej furii.
policz 0

Dzięki @ count0. Właściwie sensowne jest posiadanie punktów many lub coś w tym miejscu, aby skomentować pytanie, czego jeszcze nie mogłem zrobić. W niektórych przypadkach przydatne byłyby dalsze pytania, ponieważ uczę się nowego zestawu umiejętności. Jeszcze raz. TY.
Scottieie,

1
musimy użyć nazwy wszystkich kolumn, aby tego użyć.
Arpit Sisodia

z którego pakietu renamepochodzi ta funkcja?
Diego

3

Jeśli wiesz, że twoja ramka danych ma tylko jedną kolumnę, możesz użyć: names(trSamp) <- "newname2"


3

Możesz także spróbować „upData” z pakietu „Hmisc”.

library(Hmisc)

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


Bardzo dobrze! Można także zmienić nazwę więcej kolumn jednocześnie: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

Pytanie PO zostało dobrze i szczerze udzielone. Oto sztuczka, która może być przydatna w niektórych sytuacjach: częściowe dopasowanie nazwy kolumny, niezależnie od jej pozycji w ramce danych:

Częściowe dopasowanie nazwy:

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

Kolejny przykład: częściowe dopasowanie w przypadku „interpunkcji”:

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

To były przykłady, z którymi miałem dziś do czynienia, pomyślałem, że warto się nimi podzielić.



0

Możemy użyć rename_withdo zmiany nazwy kolumn za pomocą funkcji (stringr na przykład funkcji).

Rozważ następujące dane 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" 

Zmień nazwę wszystkich zmiennych za pomocą 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"

Zmiany nazwy o nazwą cząsteczki z niektórych dplyrczasowników ( starts_with, ends_with, contains,matches , ...).

Przykład z .( xzmienne):

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"

Zmiana nazwy przez klasy z wieloma funkcjami testu klasy, jak is.integer, is.numeric, is.factor...

Przykład z is.integer( y):

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"

Ostrzeżenie:

Komunikaty ostrzegawcze: 1: In stri_replace_first_regex (string, pattern, fix_replacement (replace),: dłuższa długość obiektu nie jest wielokrotnością krótszej długości obiektu 2: W nazwach [cols] <- .fn (names [cols], ...) : liczba elementów do zastąpienia nie jest wielokrotnością długości wymiany

Nie ma to znaczenia, ponieważ jest to po prostu niespójność seq_along(.)z funkcją zamiany.


-1

Chciałbym po prostu dodać nową kolumnę do ramki danych o żądanej nazwie i uzyskać dane dla niej z istniejącej kolumny. lubię to:

dataf$value=dataf$Article1Order

następnie usuwam starą kolumnę! lubię to:

dataf$Article1Order<-NULL

Ten kod może wydawać się głupi! Ale działa idealnie ...


-1

Chciałbym po prostu zmienić nazwę kolumny na zestaw danych z nową nazwą, którą chcę, za pomocą następującego kodu: names (zestaw danych) [wartość_indeksu] <- „nowa_kolumna”


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.