通过查找另一个数据框重命名列

时间:2018-03-30 01:23:06

标签: r dplyr

我有一个数据框

> original
  a b
1 1 4
2 2 5
3 3 6

和另一个将旧名称与新名称相关联的数据框

> new
  old_name new_name
1        a        c
2        b        d

我想应用映射,因此列获得新名称:

> result
  c d
1 1 4
2 2 5
3 3 6

以下是代码:

library(tidyverse)
original = data.frame(a=c(1,2,3),b=c(4,5,6))
new = data.frame(old_name=c('a','b'), new_name=c('c','d'))
result = original %>% rename(c=a,d=b)
dput(list(original, new, result))

2 个答案:

答案 0 :(得分:2)

我们可match names original new$old_name new_name,然后选择相应的names并将其应用于original names(original) <- new$new_name[match(names(original), new$old_name)] original # c d #1 1 4 #2 2 5 #3 3 6 1}}。

dplyr

setnames library(dplyr) original %>% setNames(new$new_name[match(names(original), new$old_name)])

中使用相同的逻辑
bubble sort algorithm

答案 1 :(得分:1)

或者将dplyr::renameUQS!!!一起使用(取消引用并拼接参数):

library(dplyr)

original %>% 
    rename(!!!setNames(new$old_name, new$new_name))

#  c d
#1 1 4
#2 2 5
#3 3 6

从旧名称到新名称创建mapping

mapping <- setNames(new$old_name, new$new_name)
mapping
#  c   d 
#"a" "b"
{p> splice mappingrename!!!

original %>% rename(!!!mapping)

相当于rename(c = a, d = b)