【问题标题】:Rename Columns Based On Vector [duplicate]基于向量重命名列
【发布时间】:2020-05-24 16:26:12
【问题描述】:
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))

我有数据、“数据”和一个数据框“名称”,其中包含“数据”的列名和变量标签。

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

【问题讨论】:

标签: r dplyr rename


【解决方案1】:

你要这个吗?使用您的示例:

> names(data) <- names$labels
> names(data)
[1] "whale"  "toast"  "cheese" "cow"   

【讨论】:

    【解决方案2】:

    我们可以使用dplyr 中的rename_at(假设'names' 数据集中的列是character 类)

    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
    

    或者通过deframeing转换成命名向量然后直接匹配

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

    【讨论】:

    • deframe 来自哪里?
    • @Tjebo 对不起,来自library(tibble)
    【解决方案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))
    

    要获取名称,最好使用匹配:

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

    【讨论】:

      【解决方案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
      

      reprex package (v0.3.0) 于 2020-02-09 创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 2015-12-06
        • 1970-01-01
        相关资源
        最近更新 更多