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]
screechOwl
quelle
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"
Joshua Ulrich
quelle
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.
Side_0o_Effect
quelle
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'
zongshiwujie
quelle
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)
Ricardo Saporta
quelle
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
Erklärung
quelle
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.

Luis Vazquez
quelle
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.

jshepherd
quelle
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
Moody_Mudskipper
quelle
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

Jeromy Anglim
quelle
Das ist am einfachsten, danke. Hatte Probleme mit dem dplyr-Paket.
DannyB
4

Versuchen:

colnames(x)[2] <- 'newname2'
NPE
quelle
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"))
Scottieie
quelle
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"


quelle
3

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

library(Hmisc)

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

ansek
quelle
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.

PatrickT
quelle
0

Ich fand das colnames()Argument einfacher https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

Wählen Sie eine Spalte aus dem Datenrahmen aus

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])

und benennen Sie die ausgewählte Spalte der Reihe nach um.

colnames(df) <- c("hhid", "income", "cost", "credit")

Überprüfen Sie die Namen und Werte, um sicherzugehen

names(df);head(df)
Seyma Kalay
quelle
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.

neves
quelle
-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 ...

Niloufar
quelle
-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"

Parthiban M.
quelle
-3
library(dplyr)
rename(data, de=de.y)
Hallo Welt
quelle
Möchten Sie ein wenig hinzufügen, warum dies dem Problem von OP hilft?
Guillaume Racicot