Переименовать столбцы на основе вектора - PullRequest
2 голосов
/ 09 февраля 2020
set.seed(0)
data=data.frame("V1"=sample(1:10,size=4,rep=T),
                "V2"=sample(1:10,size=4,rep=T),
                "V3"=sample(1:10,size=4,rep=T),
                "V4"=sample(1:10,size=4,rep=T))

names = data.frame("vars"=c("V1", "V2", "V3", "V4"),
                   "labels"=c("whale","toast","cheese","cow"))


want=data.frame("whale"=sample(1:10,size=4,rep=T),
                "toast"=sample(1:10,size=4,rep=T),
                "cheese"=sample(1:10,size=4,rep=T),
                "cow"=sample(1:10,size=4,rep=T))

У меня есть данные, «данные» и фрейм данных «имена», которые содержат имена столбцов «данных» и метки переменных.

Я хочу создать новые данные «хочу», которые заменяют имена переменных в «data» с метками переменных в «names» Обратите внимание, что фактические значения отличаются, потому что я не знаю, как обеспечить одинаковые выборочные значения!

Ответы [ 4 ]

3 голосов
/ 09 февраля 2020

Другой вариант, использующий именованный вектор, но с rename и !!!:

library(dplyr)

# make your named vector (maybe easier to do this directly instead of creating the data frame first), e.g. 
# name_vec <- setNames(c("V1", "V2", "V3", "V4"), c("whale", "toast", "cheese", "cow"))

name_vec <- setNames(as.character(names$vars),as.character( names$labels))

data %>% rename(!!!name_vec)

#>   whale toast cheese cow
#> 1     9     2      1   6
#> 2     4     7      5  10
#> 3     7     2      5   7
#> 4     1     3     10   9

Создан в 2020-02-09 пакетом Представить ( v0.3.0)

3 голосов
/ 09 февраля 2020

Мы можем использовать rename_at из dplyr (при условии, что столбцы в наборе данных 'names' character class)

library(dplyr)
data <- data %>% 
            rename_at(vars(names$vars), ~ names$labels)
data
#   whale toast cheese cow
#1     9     2      1   6
#2     4     7      5  10
#3     7     2      5   7
#4     1     3     10   9

Или преобразовать в именованный вектор с помощью deframe и затем непосредственно соответствует

names %>% 
     mutate_all(as.character) %>%
     deframe %>%
     {set_names(data, .[names(data)])}
2 голосов
/ 09 февраля 2020

Вы спрашиваете об этом? Используя ваш пример:

> names(data) <- names$labels
> names(data)
[1] "whale"  "toast"  "cheese" "cow"   
1 голос
/ 09 февраля 2020

Вы можете получить тот же фрейм данных, установив одинаковое начальное число:

set.seed(0)
data=data.frame("V1"=sample(1:10,size=4,rep=T),
                "V2"=sample(1:10,size=4,rep=T),
                "V3"=sample(1:10,size=4,rep=T),
                "V4"=sample(1:10,size=4,rep=T))

names = data.frame("vars"=c("V1", "V2", "V3", "V4"),
                   "labels"=c("whale","toast","cheese","cow"))

set.seed(0)
want=data.frame("whale"=sample(1:10,size=4,rep=T),
                "toast"=sample(1:10,size=4,rep=T),
                "cheese"=sample(1:10,size=4,rep=T),
                "cow"=sample(1:10,size=4,rep=T))

И чтобы получить имена, лучше использовать совпадение:

want = setNames(
data.frame(data),
names$labels[match(colnames(data),names$vars)]
)
...