wake-up-neo.com

Benennen Sie mehrere Spalten nach Namen um

Jemand hätte das schon fragen sollen, aber ich konnte keine Antwort finden. Sag ich habe:

x = data.frame(q=1,w=2,e=3, ...and many many columns...)  

was ist der eleganteste Weg, eine beliebige Teilmenge von Spalten, deren Position ich nicht unbedingt kenne, in andere beliebige Namen umzubenennen?

z.B. Angenommen, ich möchte "q" und "e" in "A" und "B" umbenennen. Was ist der eleganteste Code dafür?

Natürlich kann ich eine Schleife machen:

oldnames = c("q","e")
newnames = c("A","B")
for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]

Aber ich frage mich, ob es einen besseren Weg gibt? Vielleicht mit einigen Paketen? (plyr::rename usw.)

51
qoheleth

setnames aus dem data.tablepackage funktioniert mit data.frames oder data.tables

library(data.table)
d <- data.frame(a=1:2,b=2:3,d=4:5)
setnames(d, old = c('a','d'), new = c('anew','dnew'))
d


 #   anew b dnew
 # 1    1 2    4
 # 2    2 3    5

Beachten Sie, dass die Änderungen per Verweis vorgenommen werden, also kein Kopieren (auch für data.frames!).

79
mnel

Mit Dplyr würden Sie Folgendes tun:

library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)

df %>% rename(A = q, B = e)

#  A w B
#1 1 2 3

Oder wenn Sie Vektoren verwenden möchten, wie von @ Jelena-bioinf vorgeschlagen:

library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)

oldnames = c("q","e")
newnames = c("A","B")

df %>% rename_at(vars(oldnames), ~ newnames)

#  A w B
#1 1 2 3
44
Gorka

Eine andere Lösung für Datenrahmen, die nicht zu groß sind, ist (auf @thelatemail-Antwort aufgebaut):

x <- data.frame(q=1,w=2,e=3)

> x
  q w e
1 1 2 3

colnames(x) <- c("A","w","B")

> x
  A w B
1 1 2 3

Alternativ können Sie auch verwenden:

names(x) <- c("C","w","D")

> x
  C w D
1 1 2 3

Außerdem können Sie eine Teilmenge der Spaltennamen umbenennen:

names(x)[2:3] <- c("E","F")

> x
  C E F
1 1 2 3
28
Jaap

Ich bin also kürzlich auf dieses Thema gestoßen, wenn Sie nicht sicher sind, ob die Spalten existieren und nur diejenigen umbenennen möchten, die dies tun: 

existing <- match(oldNames,names(x))
names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]
10
JoelKuiper

Hier habe ich die effizienteste Methode gefunden, mehrere Spalten mit einer Kombination aus purrr::set_names() und einigen stringr-Operationen umzubenennen.

library(tidyverse)

# Make a tibble with bad names
data <- tibble(
    `Bad NameS 1` = letters[1:10],
    `bAd NameS 2` = rnorm(10)
)

data 
# A tibble: 10 x 2
   `Bad NameS 1` `bAd NameS 2`
   <chr>                 <dbl>
 1 a                    -0.840
 2 b                    -1.56 
 3 c                    -0.625
 4 d                     0.506
 5 e                    -1.52 
 6 f                    -0.212
 7 g                    -1.50 
 8 h                    -1.53 
 9 i                     0.420
 10 j                     0.957

# Use purrr::set_names() with annonymous function of stringr operations
data %>%
    set_names(~ str_to_lower(.) %>%
                  str_replace_all(" ", "_") %>%
                  str_replace_all("bad", "good"))

# A tibble: 10 x 2
   good_names_1 good_names_2
   <chr>               <dbl>
 1 a                  -0.840
 2 b                  -1.56 
 3 c                  -0.625
 4 d                   0.506
 5 e                  -1.52 
 6 f                  -0.212
 7 g                  -1.50 
 8 h                  -1.53 
 9 i                   0.420
10 j                   0.957
6
Matt Dancho

Aufbauend auf der Antwort von @ user3114046:

x <- data.frame(q=1,w=2,e=3)
x
#  q w e
#1 1 2 3

names(x)[match(oldnames,names(x))] <- newnames

x
#  A w B
#1 1 2 3

Dies ist nicht abhängig von einer bestimmten Reihenfolge der Spalten im x-Dataset.

5
thelatemail

Dies würde alle Vorkommen dieser Buchstaben in allen Namen ändern:

 names(x) <- gsub("q", "A", gsub("e", "B", names(x) ) )
4
42-
names(x)[names(x) %in% c("q","e")]<-c("A","B")
3
James King

Sie können den Namen festlegen, als Liste speichern und dann den String umbenennen. Ein gutes Beispiel dafür ist, wenn Sie einen langen oder breiten Übergang für ein Dataset durchführen:

names(labWide)
      Lab1    Lab10    Lab11    Lab12    Lab13    Lab14    Lab15    Lab16
1 35.75366 22.79493 30.32075 34.25637 30.66477 32.04059 24.46663 22.53063

nameVec <- names(labWide)
nameVec <- gsub("Lab","LabLat",nameVec)

names(labWide) <- nameVec
"LabLat1"  "LabLat10" "LabLat11" "LabLat12" "LabLat13" "LabLat14""LabLat15"    "LabLat16" " 
2
Boyce Byerly

Wenn die Tabelle zwei Spalten mit demselben Namen enthält, lautet der Code folgendermaßen:

rename(df,newname=oldname.x,newname=oldname.y)
1
varun

Viele Arten von Antworten, also habe ich die Funktion so geschrieben, dass Sie sie kopieren/einfügen können. 

rename <- function(x, old_names, new_names) {
    stopifnot(length(old_names) == length(new_names))
    # pull out the names that are actually in x
    old_nms <- old_names[old_names %in% names(x)]
    new_nms <- new_names[old_names %in% names(x)]

    # call out the column names that don't exist
    not_nms <- setdiff(old_names, old_nms)
    if(length(not_nms) > 0) {
        msg <- paste(paste(not_nms, collapse = ", "), 
            "are not columns in the dataframe, so won't be renamed.")
        warning(msg)
    }

    # rename
    names(x)[names(x) %in% old_nms] <- new_nms
    x
}

 x = data.frame(q = 1, w = 2, e = 3)
 rename(x, c("q", "e"), c("Q", "E"))

   Q w E
 1 1 2 3
1
Dan

Wenn Sie eine Zeichenfolge mit allen Spaltennamen verketten möchten, können Sie diesen einfachen Code verwenden.

colnames(df) <- paste("renamed_",colnames(df),sep="")
1
Corey Levinson

Wenn eine Zeile der Daten die Namen enthält, in die Sie alle Spalten ändern möchten, können Sie dies tun

names(data) <- data[row,]

Angenommen, data ist Ihr Datenrahmen und row ist die Zeilennummer, die die neuen Werte enthält.

Dann können Sie die Zeile mit den Namen mit entfernen

data <- data[-row,]
0

Dies ist die Funktion, die Sie benötigen: Dann übergeben Sie einfach das x in einer Umbenennung (X), und es werden alle angezeigten Werte umbenannt

rename <-function(x){
  oldNames = c("a","b","c")
  newNames = c("d","e","f")
  existing <- match(oldNames,names(x))
  names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]
  return(x)
}
0
Zuti