2017-08-16 1 views
3

Was ist der beste Weg, um Spalten mithilfe eines Nachschlagedatenrahmens umzubenennen?Programmatische Umbenennung von Datenrahmenspalten mithilfe des Nachschlagedatenrahmens

Kann ich es als Teil einer Rohrleitung machen?

library(tidyverse) 

df <- data_frame(
    a = seq(1, 10) 
    , b = seq(10, 1) 
    , c = rep(1, 10) 
) 

df_lookup <- data_frame(
    old_name = c("b", "c", "a") 
    , new_name = c("y", "z", "x") 
) 

Ich weiß, wie es manuell in tidyverse/dplyr Pakete

df %>% 
    rename(x = a 
    , y = b 
    , z = c) 

Ich suche eine Lösung zu tun.

+1

'Namen (df) [Übereinstimmung (old_name, Namen (df))] <- new_name' Ich bin ziemlich diese Frage wurde schon beantwortet. Ich erinnere mich daran, es aufgewertet zu haben. – Masoud

Antwort

4

Verwendung rlang; Zum einen eine Liste von Namen aufzubauen syms verwenden, und dann spleißen die Argumente rename mit UQS oder !!! Betreiber:

library(rlang); library(dplyr) 

df %>% rename(!!!syms(with(df_lookup, setNames(old_name, new_name)))) 

# A tibble: 10 x 3 
#  x  y  z 
# <int> <int> <dbl> 
# 1  1 10  1 
# 2  2  9  1 
# 3  3  8  1 
# 4  4  7  1 
# 5  5  6  1 
# 6  6  5  1 
# 7  7  4  1 
# 8  8  3  1 
# 9  9  2  1 
#10 10  1  1 
1

Sie könnten Ihren eigenen Helfer schreiben, um es einfacher

rename_to <- function(data, old, new) { 
    data %>% rename_at(old, function(x) new[old==x]) 
} 

df %>% rename_to(df_lookup$old_name, df_lookup$new_name) 
1

in der Basis-R:

names(df)[match(df_lookup$old_name,names(df))] <- df_lookup$new_name 

# # A tibble: 10 x 3 
#  x  y  z 
# <int> <int> <dbl> 
# 1  1 10  1 
# 2  2  9  1 
# 3  3  8  1 
# 4  4  7  1 
# 5  5  6  1 
# 6  6  5  1 
# 7  7  4  1 
# 8  8  3  1 
# 9  9  2  1 
# 10 10  1  1 

data.table Verwendung:

library(data.table) 
setnames(setDT(df), old = df_lookup$old_name, new = df_lookup$new_name) 

#  x y z 
# 1: 1 10 1 
# 2: 2 9 1 
# 3: 3 8 1 
# 4: 4 7 1 
# 5: 5 6 1 
# 6: 6 5 1 
# 7: 7 4 1 
# 8: 8 3 1 
# 9: 9 2 1 
# 10: 10 1 1 
Verwandte Themen