Wie benenne ich eine einzelne Spalte in einem data.frame um?


335

Ich weiß, wenn ich einen Datenrahmen mit mehr als einer Spalte habe, kann ich verwenden

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

um die Spalten umzubenennen. Wie mache ich das, wenn es nur eine Spalte ist? Bedeutet einen Vektor oder Datenrahmen mit nur einer Spalte.

Beispiel:

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
Die Lösung von @ aix funktioniert für einen 1-spaltigen data.frame. Sie werden wahrscheinlich durch das drop=TRUEStandardargument to verwirrt [, das bewirkt, dass ein "1-Spalten" -Objekt in einen Vektor konvertiert wird ... und Vektoren nicht haben colnames. Ein Beispiel für das, was Sie versucht haben, wäre sehr hilfreich.
Joshua Ulrich

2
es funktioniert, wenn Sie "colnames (x) [1] <- 'newname2'"
screechOwl

Antworten:


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

versucht, den Namen der zweiten Spalte festzulegen. Ihr Objekt hat nur eine Spalte, daher gibt der Befehl einen Fehler aus. Dies sollte ausreichen:

colnames(trSamp) <- "newname2"

1
JoshuaUlrich @ -. Dies scheint nicht zu funktionieren , wenn der Spaltenname ist wie etwas , "A,B,C,X,Y,Z"wo ich will es umbenennen zu Yverwenden testData[379] <- "Y".
Chetan Arvind Patil

575

Dies ist eine verallgemeinerte Methode, bei der Sie sich nicht an die genaue Position der Variablen erinnern müssen:

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

Dieser Code macht so ziemlich Folgendes:

  1. names(df) schaut in alle Namen in der df
  2. [names(df) == old.var.name] extrahiert den Variablennamen, den Sie überprüfen möchten
  3. <- 'new.var.name' weist den neuen Variablennamen zu.

5
Ich bin auch ziemlich neu bei R, habe diese Lösung geliebt! Ich habe tatsächlich überprüft, was es tut, und ich denke, es lohnt sich anzugeben, dass [names(df) == old.var.name]tatsächlich ein Vektor mit wahren / falschen Werten zurückgegeben wird. So kann es mehrere Spaltennamen ändern, wenn beispielsweise reguläre Ausdrücke verwendet werden.
Mikyatope

3
Verwenden Sie für Ergebnisse mit regulären Ausdrücken etwas wie names(df) = sub('pattern', 'replacement', names(df)). Andernfalls würden Sie versuchen, mehrere Spalten auf denselben Namen festzulegen.
Wir sind alle Monica

40
Gemischte Gefühle ... in einer perfekten Welt, in der es viele perfekte Programmiersprachen gibt, wären wirklich so viele Tastenanschläge erforderlich, um den Namen einer einzelnen Spalte zu ändern? Ich liebe R, aber manchmal möchte ich es aus diesen Gründen erwürgen.
tumultous_rooster

4
Wie gibt es dafür keine Wrapper-Funktion in Base?
ifly6

1
Wie wir uns alle wünschen! Ich weiß es jetzt nicht, aber damals gab es keinen Wrapper in der Basis
Side_0o_Effect

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

2
Ich mag diese Lösung, da Sie den Spaltennamen nach Namen referenzieren können, anstatt zu wissen, um welche Zahlenspalte es sich handelt. Besser für Funktionen mit größerer Anzahl.
Kybernetisch

1
Ich habe eine kleine Erweiterung der Frage und dieser Antwort. Ich habe einen Datenrahmen mit einer Spalte, die die Buchstaben 'snp' enthält . Ich möchte es in 'Marker' umbenennen . Aber ich möchte dazu einen regulären Ausdruck verwenden. Anscheinend ist der Code, den ich habe, fehlerhaft : colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker", weil die Spalte nicht umbenannt wird. Wenn ich es tue names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker", wird es umbenannt. Was vermisse ich?
Sander W. van der Laan

76

Dies ist eine alte Frage, aber es ist erwähnenswert, dass Sie sie jetzt setnamesaus dem data.tablePaket verwenden können.

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
oder setNamesvon der Basis R.
PatrickT

53

Dies kann auch mit Hadleys plyrPaket und der renameFunktion erfolgen.

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

Sie können nach dem Namen umbenennen (ohne die Position zu kennen) und mehrere Umbenennungen gleichzeitig durchführen. Nach einer Zusammenführung könnten Sie beispielsweise Folgendes erhalten:

  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

Was Sie dann in einem Schritt umbenennen können mit:

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
renameist jetzt auch eine Funktion im dplyrPaket.
Sam Firke

36

Ich denke, der beste Weg, Spalten umzubenennen, ist die Verwendung des dplyr- Pakets wie folgt :

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

Dies funktioniert genauso, wenn eine oder mehrere Spalten in einem Datensatz umbenannt werden.


12

Ich mag den nächsten Stil zum Umbenennen von Datenrahmenspaltennamen nacheinander.

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

wo

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

Gibt nach dem Index der jeweiligen Spalte zurück.


1
+1, um dem Benutzer die Möglichkeit zu geben, den tatsächlichen alten Namen zu verwenden :)

1
Was ist hier der Unterschied zur Lösung von @zongshiwujie?
Buhtz

which()ist nicht nötig.
Sindri_baldur

12

Ich finde, dass der bequemste Weg, eine einzelne Spalte umzubenennen, die Verwendung von 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
  • funktioniert gut in Rohrketten
  • Praktisch, wenn Namen in Variablen gespeichert sind
  • arbeitet mit einem Namen oder einem Spaltenindex
  • klar und kompakt

6

Sie können das rename.varsim gdataPaket verwenden.

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

Dies ist besonders nützlich, wenn Sie mehr als einen Variablennamen ändern müssen oder wenn Sie Text an die Variablennamen anhängen oder vorhängen möchten. Dann können Sie Folgendes tun:

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

Ein Beispiel für das Anhängen von Text an eine Teilmenge von Variablennamen finden Sie unter: https://stackoverflow.com/a/28870000/180892


Das ist am einfachsten, danke. Hatte Probleme mit dem dplyr-Paket.
DannyB

4

Versuchen:

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

8
Dies ist es, was den Fehler ausgelöst hat, nach dem OP gefragt hat (in seiner Bearbeitung). Es wird nicht funktionieren, da der Datenrahmen nur eine Spalte hat.

NPE @ -. Dies scheint nicht zu funktionieren , wenn der Spaltenname ist wie etwas , "A,B,C,X,Y,Z"wo ich es umbenennen möchten Yverwenden testData[379] <- "Y".
Chetan Arvind Patil

4

Dies ist wahrscheinlich schon da draußen, aber ich habe bei der Suche nach einer Lösung mit dem Umbenennen von Feldern gespielt und dies aus einer Laune heraus versucht. Arbeitete für meine Zwecke.

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

Die Bearbeitung beginnt hier ....

Das funktioniert auch.

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

Für jeden, der mich abgemeldet hat, ist das in Ordnung, aber da ich offensichtlich neu darin bin, könnten Sie vielleicht aufklären, was mit der Antwort falsch war.
Scottieie

An Ihrer Antwort ist nichts auszusetzen, außer dass sie kein Oneliner ist. Das war nur ein feindlicher SO-Benutzer, der nicht den Mut hatte, seinen Wutanfall zu rechtfertigen.
count0

Danke @ count0. Es ist tatsächlich sinnvoll, einige Manapunkte oder was auch immer zu haben, um eine Frage zu kommentieren, was ich bisher noch nicht konnte. In einigen Fällen wären Anschlussfragen hilfreich, wenn ich neue Fähigkeiten erlernen würde. Nochmal. TY.
Scottieie

1
Wir müssen allen Spalten einen Namen geben, um dies zu verwenden.
Arpit Sisodia

Von welchem ​​Paket kommt die renameFunktion?
Diego

3

Wenn Sie wissen, dass Ihr Datenrahmen nur eine Spalte enthält, können Sie Folgendes verwenden: names(trSamp) <- "newname2"


3

Sie können auch 'upData' aus dem 'Hmisc'-Paket ausprobieren.

library(Hmisc)

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


Sehr schön! Es ist auch möglich, mehrere Spalten gleichzeitig umzubenennen: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

Die Frage des OP wurde wirklich beantwortet. Hier ist jedoch ein Trick, der in einigen Situationen nützlich sein kann: teilweise Übereinstimmung des Spaltennamens, unabhängig von seiner Position in einem Datenrahmen:

Teilweise Übereinstimmung mit dem Namen:

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

Ein weiteres Beispiel: partielle Übereinstimmung bei Vorhandensein von "Interpunktion":

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

Dies waren Beispiele, mit denen ich mich heute befassen musste. Ich dachte, es könnte sich lohnen, sie zu teilen.



0

Wir können rename_withSpalten mit einer Funktion umbenennen ( stringrz. B. Funktionen).

Betrachten Sie die folgenden Daten 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" 

Benennen Sie alle Variablen um mit 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"

Umbenennen von Namen Teilchen mit einigen dplyrVerben ( starts_with, ends_with, contains,matches , ...).

Beispiel mit .( xVariablen):

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"

Benennen von Klasse mit vielen Funktionen der Klasse Test, wie is.integer, is.numeric, is.factor...

Beispiel mit 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"

Die Warnung:

Warnmeldungen: 1: In stri_replace_first_regex (Zeichenfolge, Muster, fix_replacement (Ersetzung): längere Objektlänge ist kein Vielfaches kürzerer Objektlänge 2: In Namen [Spalten] <- .fn (Namen [Spalten], ...) : Die Anzahl der zu ersetzenden Elemente ist kein Vielfaches der Ersatzlänge

Es ist nicht relevant, da es nur eine Inkonsistenz seq_along(.)mit der Ersetzungsfunktion ist.


-1

Ich würde dem Datenrahmen einfach eine neue Spalte mit dem gewünschten Namen hinzufügen und die Daten dafür aus der vorhandenen Spalte abrufen. so was:

dataf$value=dataf$Article1Order

dann entferne ich die alte Spalte! so was:

dataf$Article1Order<-NULL

Dieser Code könnte albern erscheinen! Aber es funktioniert perfekt ...


-1

Ich würde einfach einen Spaltennamen in das Dataset mit dem neuen Namen ändern, den ich mit dem folgenden Code möchte: names (Dataset) [index_value] <- "new_col_name"


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.