根据向量重命名列 [duplicate]

Rename Columns Based On Vector [duplicate]

提问人:bvowe 提问时间:2/9/2020 最后编辑:tjebobvowe 更新时间:8/24/2023 访问量:7015

问:

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”和一个包含“data”和变量标签的列名的数据帧“names”。

我想创建新数据“want”,将“data”中的变量名称替换为“names”中的变量标签,但是请注意,实际值是不同的,因为我不知道如何确保相同的采样值!

R dplyr 重命名

评论


答:

3赞 novica 2/9/2020 #1

你是在要求这个吗?以您的示例为例:

> names(data) <- names$labels
> names(data)
[1] "whale"  "toast"  "cheese" "cow"   
8赞 akrun 2/9/2020 #2

我们可以使用 from(假设“names”数据集中的列是类)rename_atdplyrcharacter

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

或者通过ing转换为命名向量,然后直接匹配deframe

names %>% 
     mutate_all(as.character) %>%
     deframe %>%
     {set_names(data, .[names(data)])}

评论

0赞 tjebo 2/9/2020
从哪里来?deframe
1赞 akrun 2/10/2020
@Tjebo对不起,它是来自library(tibble)
1赞 StupidWolf 2/9/2020 #3

您可以通过设置相同的种子来获得相同的数据框:

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))

要获得名称,最好使用 match:

want = setNames(
data.frame(data),
names$labels[match(colnames(data),names$vars)]
)
6赞 tjebo 2/9/2020 #4

另一个使用命名向量的选项,但带有 和 :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 由 reprex 软件包 (v0.3.0)